我的代码如下。它正确读取我的资产文件夹中的sqlite数据库文件(我已经使用SQLite数据库浏览器创建) - 将其移动到我的设备上的/ data / data / packagename / databases / 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 Brower向其中一个表(在assets文件夹中的数据库中)添加一行信息,但这并没有反映在我的光标输出中 - 我理解为什么这种情况正在发生 - 因为如果(!dbFile.exists())失败,那么就没有复制要做。所以我的问题是 - 我需要添加哪些代码才能使其工作?我从来没有用代码创建表,所以我不知道onUpgrade方法对我来说有多大用处。
答案 0 :(得分:1)
做事的“正确”方式与你的出发方式截然不同。我不会去那里,而是假设您想保留当前创建数据库的方法,我将提供一个使用它的建议。向数据库添加一个表,该表包含一行元数据,其中包括数据库版本(以及您喜欢的任何其他内容)。如果数据库文件已存在,请将其打开并检查版本。如果版本旧,请关闭它并替换它。
答案 1 :(得分:1)
您有三种选择:
使用onUpgrade()(首选)
删除现有数据库并复制新数据库(不是一个好主意)
复制现有数据库中的数据,删除现有数据库,复制新数据库,将旧数据库中的数据插入新数据库(在onUpgrade中升级新数据库模式时工作量太大)。
因此,要回答您的问题,请在onUpgrade()中升级数据库,而不必重新创建任何表。
另一方面,如果您刚刚向特定表添加了一个新行,则数据库模式没有更改,您只需在运行时插入新行...当然,不知道您的应用程序的用途是什么可能不是一个好主意,因为您很容易忘记对“静态”数据库的更改。