2017-11-10 14 views
-1

ユーザーのScrollViewの位置を保存した後に保存したい場合があります。SQLiteのUPDATEコマンドでデータベースが更新されない

私はこれをの中にgetScrollYの位置にキャプチャしてデータベースに保存してから、ユーザーが戻ったときに取得しようとしています。

私は正常に位置を追加して取得できますが(Log.i("scrolly", Integer.toString(scrollY))は期待通りに戻ります)、ScrollViewは正しい位置にジャンプしていません。 StoryBodyActivityの

パート:私のDatabaseHelperの

public class StoryBodyActivity extends AppCompatActivity { 

    private TextView storyBodyTextView; 
    private ScrollView storyBodyScrollView; 
    public int storyID; 
    Parcelable state; 
    int scrollY; 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_story_body, menu); 
     return true; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_story_body); 

     Bundle extras = getIntent().getExtras(); 

     String story = extras.getString("story"); 
     storyID = extras.getInt("story_id"); 
     Log.i("stories", Integer.toString(storyID)); 

     storyBodyTextView = (TextView) findViewById(R.id.story_body_text_view); 
     storyBodyScrollView = (ScrollView) findViewById(R.id.story_body_scroll_view); 

     DatabaseHelper db = new DatabaseHelper(this); 
     scrollY = db.getScrollPosition(storyID); 
     Log.i("scrolly", Integer.toString(scrollY)); 

     storyBodyScrollView.scrollTo(0, scrollY); 

     String storyBody = db.getStoryBody(storyID); 

     storyBodyTextView.setText(Html.fromHtml(storyBody)); 

     if(state != null) { 
      Log.d("pause", "trying to restore textview state.."); 
      storyBodyTextView.onRestoreInstanceState(state); 
     } 

     int scroll = storyBodyScrollView.getScrollY(); 
     Log.i("scroll", Integer.toString(scroll)); 

    } 

    @Override 
    public void onPause() { 

     scrollY = storyBodyScrollView.getScrollY(); 
     Log.i("scroll", Integer.toString(scrollY)); 
     Log.i("insert", Integer.toString(storyID)); 
     DatabaseHelper db = new DatabaseHelper(this); 
     db.setScrollPosition(scrollY, storyID); 
     super.onPause(); 
    } 

} 

パート:

public class DatabaseHelper extends SQLiteAssetHelper { 

    private static final int DATABASE_VERSION = 1; 

    private static final String DATABASE_NAME = "database9.db"; 
    private static final String BOOKS = "books"; 
    private static final String AUTHORS = "authors"; 

    public DatabaseHelper (Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     setForcedUpgrade(); 
    } 

    public int setScrollPosition(int scrollY, int storyID) { 

     String insertQuery = "UPDATE " + BOOKS + " SET scroll_position = '" + scrollY + "' WHERE id = '" + storyID + "'"; 
     Log.i("insert", insertQuery); 
     SQLiteDatabase db = this.getWritableDatabase(); 
     db.execSQL(insertQuery); 

     return 0; 

    } 

    public int getScrollPosition(int storyID) { 

     int scrollPosition = 0; 

     String selectQuery = "SELECT scroll_position FROM " + BOOKS + " WHERE id = '" + storyID + "'"; 

     SQLiteDatabase db = this.getWritableDatabase(); 
     Cursor cursor = db.rawQuery(selectQuery, null); 

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       scrollPosition = cursor.getInt(0); 
      } while (cursor.moveToNext()); 
     } 

     return scrollPosition; 

     } 
} 

UPDATE:

マイスキーマ:

CREATE TABLE "books" (
`id` INTEGER NOT NULL, 
`title` TEXT, 
`author_id` INTEGER, 
`collection` TEXT, 
`body` TEXT, 
`scroll_position` INTEGER, 
PRIMARY KEY(`id`)) 
+0

私の前のコメントはあなたの質問に答えます。 –

答えて

0

INSERTコマンドでは、文字列をIDとして渡しますが、の整数はです。

String insertQuery = "UPDATE " + BOOKS + " SET scroll_position = '" + scrollY + "' WHERE id = '" + storyID + "'"; 

ご覧ください。 storyIDは文字列("' WHERE id = '" + storyID + "'")として渡されます!
一重引用符は、idを文字列としてマークします。

整数列を作成すると、文字列と一致することはありません。

CREATE TABLE "books" (
`id` INTEGER NOT NULL, 
`title` TEXT, 
`author_id` INTEGER, 
`collection` TEXT, 
`body` TEXT, 
`scroll_position` INTEGER, 
PRIMARY KEY(`id`)) 

idフィールドは整数(良好)で作成されます。
しかし、あなたはそれをあなたのコマンド(あるいはあなたの質問)に文字列で渡すことはできません。

EDIT

またscroll_positionフィールドに文字列を渡しています。
の整数です。 これも機能しません。

+0

ありがとう - 一重引用符を削除しましたが、同じ問題があります – Sebastian

+0

したがって、渡されたIDとの一致はありません。渡されたIDがテーブルに存在することを確認してください。 ListViewの選択されたインデックスは、必ずしもテーブルの行IDと一致しないことに注意してください。 –

+0

渡された 'id'は行いますが、データベースブラウザーでテーブルを見ると、' scrollY'の出力を正常に記録しても 'scroll_position'の値はありません – Sebastian

関連する問題