0

私は以下のコードを持っています。私のアセットフォルダーにある私のsqliteデータベースファイル(SQLite Database Browserを使用して既に作成したもの)を正しく読み取ります-デバイスの/ data/data/packagename/databases /パスに移動すると、クエリを使用してクエリを実行できますカーソルを使用して情報を取得すると、うまく機能します。ここにコード:

public class DatabaseHelper extends SQLiteOpenHelper {

private Context myDbContext;
private static String dbName = "restaurant.db";
private static String outfilePath = "/data/data/dev.mypackage.com/databases/";
private static String path = outfilePath + dbName;
private static SQLiteDatabase db;

public DatabaseHelper(Context context){
    super(context, dbName, null, 2);
    this.myDbContext = context;
    db = openDb();
    String s = "select * from menu";
    Cursor c = db.rawQuery(s, null);
    Log.e("DB Constructor Row count", String.valueOf(c.getCount()).toString());

    while(c.moveToNext()){
        Log.e("DB Constructor", c.getString(c.getColumnIndex("category")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("menuItem_id")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("title")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("desc")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("price")));
        Log.e("DB Constructor", c.getString(c.getColumnIndex("icon")));
    }

    c.deactivate();
    c.close();
}

private void copyDataBase(File dbFile) throws IOException {
    try{
        InputStream dbStream = myDbContext.getAssets().open(dbName);
        OutputStream newDbFile = new FileOutputStream(outfilePath + dbName);

        byte[] buffer = new byte[1024];
        int length;
        while((length = dbStream.read(buffer)) > 0){
            newDbFile.write(buffer);
        }

        newDbFile.flush();
        newDbFile.close();
        dbStream.close();
    }
    catch(IOException e){

        throw new IOException("trying to copy the database - ERROR: " + e.getMessage());
    }   

}

private SQLiteDatabase openDb() throws SQLiteException{
    File dbFile = myDbContext.getDatabasePath(dbName);

    if(!dbFile.exists()){
        Log.e("openDb", "file does not exist");

        try {
            copyDataBase(dbFile);
        } catch (IOException e) {
            throw new RuntimeException("Error creating source database", e);
        }
    }

    return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);

}
public void loadRestaurantInfo(){

}

@Override
public void onCreate(SQLiteDatabase db){
    // TODO Auto-generated method stub      
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

ここで、SQLite Brower を使用して、戻ってテーブルの 1 つ (assets フォルダー内のデータベース内) に情報の行を追加する必要がありましたが、それがカーソル出力に反映されていません。なぜこれが起こっているのか理解しています。 - if(!dbFile.exists()) が失敗するため、コピーは行われません。だから私の質問は - これを機能させるために追加する必要があるコードは何ですか? 私はコードでテーブルを作成したことがないので、 onUpgrade メソッドが私にとってどれほど役立つかわかりません。

4

2 に答える 2

1

次の 3 つのオプションがあります。

  1. onUpgrade() を使用する (推奨)

  2. 既存のデータベースを削除し、新しいデータベースをコピーします (良い考えではありません)。

  3. 既存のデータベースにデータをコピーし、既存のデータベースを削除し、新しいデータベースをコピーし、古いデータベースから新しいデータベースにデータを挿入します (新しいデータベース スキーマが onUpgrade でアップグレードできる場合、作業が多すぎます)。

したがって、あなたの質問に答えるために、テーブルを再作成することなく onUpgrade() でデータベースをアップグレードします。

一方、特定のテーブルに新しい行を追加しただけの場合、データベース スキーマは変更されておらず、実行時に新しい行を挿入するだけで済みます...もちろん、アプリケーションの目的が何であるかがわからない場合、これはそうではない可能性があります。 「静的」データベースへの変更を簡単に追跡できないため、良い考えです。

于 2012-03-11T21:05:56.443 に答える
1

物事を行う「正しい」方法は、あなたが設定した方法とはかなり異なります。そこに行くのではなく、データベースを作成する現在の方法を維持したいと考えており、それを使用するための提案を提供します。データベースのバージョン (およびその他の必要なもの) を含む単一行のメタ データを持つテーブルをデータベースに追加します。データベースファイルが既に存在する場合は、それを開いてバージョンを確認してください。バージョンが古い場合は、閉じて差し替えてください。

于 2012-03-11T20:59:44.017 に答える