Как обновить предварительно заполненную базу данных sqlite на моем устройстве без повторного создания таблиц? - PullRequest
0 голосов
/ 12 марта 2012

У меня есть мой код ниже.Он правильно читает файл базы данных sqlite (который я уже создал с помощью браузера баз данных SQLite) в папке с активами - перемещает его в / data / data / packagename / database / path на моем устройстве, после чего я могу использовать запрос икурсор, чтобы получить мою информацию, и она прекрасно работает.Код здесь:

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, - но это не такотражено в выводе моего курсора - я понимаю, почему это происходит, - потому что если (! dbFile.exists ()) завершается неудачей, то нет необходимости копировать.Итак, мой вопрос - какой код мне нужно добавить, чтобы сделать эту работу?Я никогда не создавал таблицы с кодом, поэтому я не вижу, насколько полезным будет метод onUpgrade для меня.

Ответы [ 2 ]

1 голос
/ 12 марта 2012

У вас есть три варианта:

  1. Использовать onUpgrade () (предпочтительно)

  2. Удалить существующую базу данных и скопировать новую (не очень хорошая идея)

  3. Скопируйте данные в существующую базу данных, удалите существующую базу данных, скопируйте новую базу данных, вставьте данные из старой базы данных в новую базу данных (слишком много работы, когда новая схема базы данных может быть обновлена ​​в onUpgrade).

Итак, чтобы ответить на ваш вопрос, вы обновляете базу данных в onUpgrade (), не создавая заново никаких таблиц.

С другой стороны, если вы только что добавили новую строку в конкретную таблицу, схема базы данных не изменилась, и вы можете просто вставить новую строку во время выполнения ... конечно, не зная, какова цель вашего приложения это может быть не очень хорошая идея, так как вы можете легко потерять отслеживание изменений в вашей «статической» базе данных.

1 голос
/ 12 марта 2012

«Правильный» способ делать вещи сильно отличается от того, как вы изложили.Вместо того, чтобы идти туда, я предполагаю, что вы хотите сохранить текущий метод создания базы данных, и я предложу вам поработать с ней.Добавьте в свою базу данных таблицу с единственной строкой метаданных, которая будет включать версию базы данных (а также все, что вам нравится).Если файл базы данных уже существует, откройте его и проверьте версию.Если версия старая, закройте ее и замените.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...