У меня есть код ниже. Он правильно читает мой файл базы данных sqlite (который я уже создал с помощью SQLite Database Browser) в папке моих ресурсов - переносит его в каталог/data/data/packagename/databases/path на моем устройстве, тогда я могу использовать запрос и курсор для получения моей информации, и он отлично работает. Код здесь:Как обновить базу данных sqlite, предварительно заполненную на моем устройстве, без повторного создания таблиц?
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 для меня.
Не прокладывайте пути. Используйте 'getDatabasePath()' для создания пути к файлу базы данных. – CommonsWare