2017-11-22 2 views
0

SQLite Asset Helperを使用して、プリロードされたデータベースにアクセスしています。私はそれを正常に読むことができます(getAllAuthors()メソッドは期待どおりに動作します)。SQLite Asset Helperを使用してプリロードされたデータベースに書き込めません

Log.i("insert", insertQuery)およびLog.i("select", selectQuery)期待どおりに戻り、insertQueryまたはselectQueryのいずれかを実行するとエラーは発生しません。しかし、SQLiteアプリケーションの外部DBブラウザでデータベースを開くと、データベースに何も変わりません。

DatabaseHelper

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); 
    } 

    // THIS WORKS FINE 
    public ArrayList<Author> getAllAuthors() { 

     ArrayList<Author> authorList = new ArrayList<>(); 

     // Select all query 
     String selectQuery = "SELECT id, name FROM " + AUTHORS + " ORDER BY name_alphabetic"; 

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

     // looping through all rows and adding to list 
     if (cursor.moveToFirst()) { 
      do { 
       // create new author object 
       Author author = new Author(); 
       // set ID and name of author object 
       author.setID(Integer.parseInt(cursor.getString(0))); 
       author.setName(cursor.getString(1)); 
       // pass author object to authorList array 
       authorList.add(author); 
      } while (cursor.moveToNext()); 
     } 

     // return author list 
     return authorList; 
    } 

    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 scrollY; 

    } 

    public int getScrollPosition(int storyID) { 

     int scrollPosition = 0; 

     String selectQuery = "SELECT scroll_position FROM " + BOOKS + " WHERE id = " + storyID; 
     Log.i("select", selectQuery); 

     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; 

    } 

} 

StoryBodyActivity

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("onCreate scroll", Integer.toString(scroll)); 

    } 

    @Override 
    public void onPause() { 
     // Log.d("pause", "saving listview state @ onPause"); 
     // state = storyBodyTextView.onSaveInstanceState(); 
     scrollY = storyBodyScrollView.getScrollY(); 
     Log.i("onPause scroll", Integer.toString(scrollY)); 
     // Log.i("insert", Integer.toString(storyID)); 
     DatabaseHelper db = new DatabaseHelper(this); 
     db.setScrollPosition(scrollY, storyID); 
     super.onPause(); 
    } 

    @Override 
    public void onResume(){ 
     super.onResume(); 
     Log.i("onResume scroll", Integer.toString(scrollY)); 
     storyBodyScrollView.scrollTo(0, scrollY); 

    } 
} 

解決下記の受け入れ答えの組み合わせを使用して、そして私のScrollView(solutで問題に対処イオンhere)。

+0

@PragatiSinghごめんなさい、分かりません。言い換えてください。 – Sebastian

+0

あなたが問題なければ、実行してテストできるように完全なコード(プロジェクト)を共有できますか?サンプルアプリケーション(プロジェクト)を作成してこれを実行し、そのアプリケーションを共有することができます。 –

+0

正しいパスからデータベースを開きましたか? –

答えて

0

アセットは書き込み専用/保護されているため、データベースを更新する必要がある場合は、アセットが更新可能な場所にコピーされていることを確認する必要があります。例えばデフォルトの/ data/data/your_package/databases /フォルダー。

SQLiteAssethelperはこれを簡単に行います。

しかし、SQLiteアプリケーションの外部DBブラウザでデータベースを開くと、 データベースに何も変更されません。

setScrollPositionに新しい行を挿入したり、既存の行を更新したりしますか?コード化されているように、後者を行います。

execSQLを使用するのは、SQLiteDatabase updateメソッドは、実行される更新の数を返す代わりに、更新を実行するための推奨方法ではありません。

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 scrollY; 

} 

: - - :そのように私は変更することをお勧めしたい

public int setScrollPosition(int scrollY, int storyID) { 
    Contentvalues cv = new Contentvalues(); 
    cv.put("scroll_position", scrolly); 
    String whereclasue = "id=?"; 
    String[] whereargs = new String[]{storyID}; 

    SQLiteDatabase db = this.getWritableDatabase(); 
    int updates = db.update(BOOKS,cv,whereclause,whereargs); 
    if (updates > 0) { 
     Log.i("update","Updated " + Integer.toString(updates) + " rows."; 
    } else { 
     log.i("update","No Updates performed"); 
    } 
    return scrollY; 
} 

あなたは、更新された行の数を返すようにする方法を変更したいことがあります。

上記を使用して、ログが更新されない場合は、がログに記録されます。これにより、データベースが変更されていない理由が強調表示されます。しかし明確にする

、更新されたデータベースは、資産データベースではありません、それはあなたがthisを見てしたいと思うかもしれdata/data/your_package/databases/database9.db

に位置データベースされるフォルダ。これには、データベースとテーブルを検査するためのメソッドが含まれます。

+0

私はそれを続けています。 SQLiteAssetHelperはこれを自動的に行うのでしょうか、それとも何かする必要がありますか? – Sebastian

+0

@Sebastian私は答えを更新しました。うまくいけば、これはもっと役に立ちます。私は実際にSQLiteAssetHelperを使用したことはありません。答え[ここ](https://stackoverflow.com/questions/47389239/how-can-i-read-data-from-an-encrypted-db-using-sqliteassethelper/47402931#47402931)。 – MikeT

+0

更新していただきありがとうございます。返信が遅れましたことをお詫び申し上げます。私はあなたが提案したコードを実装していて、 '更新された1行'を期待通りに記録しますが、データベースは更新されていません。正しいデータベースを使用していることを確認するにはどうすればよいですか? – Sebastian

関連する問題