【发布时间】:2012-07-24 19:58:37
【问题描述】:
我有一个应用程序,它必须从 assets 文件夹上的 .db 文件打开一个 sqlitedatabase。每次应用启动时都必须打开此数据库。
我正在查看一些教程来处理 android 中的 sqlite 数据库以及从文件中加载 sqlite 数据库。我在这段代码中合并了所有这些教程,但它不起作用。
我的数据库包含一个名为 items 的表,其中有一些数据,但是当我从 items 调用 SELECT * 语句时,我收到一个异常,告诉我项目表不存在:
String databaseName="frases";
SQLiteManager sqlManager = new SQLiteManager(this);
sqlManager.open(databaseName);
List<String> nombres = new ArrayList<String>();
Cursor cursor=sqlManager.rawQuery("SELECT * FROM 'items'");
while (cursor.moveToNext()) {
nombres.add(cursor.getString(1));
}
for (int i=0; i<nombres.size();i++){
Log.d("DATABASE", "Nombre: "+nombres.get(i));
}
sqlManager.close(); //Cerramos la base de datos
这是我的 SQLiteManager 类:
public class SQLiteManager {
private DemoSQLiteHelper dbHelper;
private SQLiteDatabase db;
private static Context ctx;
public SQLiteManager(Context ctx) {
this.ctx = ctx;
}
public void open(String databaseName) throws SQLException {
dbHelper = new DemoSQLiteHelper(ctx, databaseName, null, 1);
generateSQLiteDB(databaseName);
db = dbHelper.getWritableDatabase();
}
public void close() {
dbHelper.close();
}
public void execSQL(String sql){
db.execSQL(sql);
}
public Cursor rawQuery(String sql){
Cursor cursor=db.rawQuery(sql, null);
return cursor;
}
public void clearDB() {
dbHelper.clearDb(db);
}
public class DemoSQLiteHelper extends SQLiteOpenHelper {
public DemoSQLiteHelper(Context contexto, String nombre, CursorFactory factory, int version) {
super(contexto, nombre, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
}
@Override
public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva) {
}
public void clearDb(SQLiteDatabase db){
onCreate(db);
}
}
private void generateSQLiteDB(String databaseName) { //
SQLiteDatabase db = dbHelper.getReadableDatabase(); // by calling this line an empty database will be created into the default system path of this app - we will then overwrite this with the database from the server
db.close();
OutputStream os = null;
InputStream is = null;
try{
is = ctx.getAssets().open(databaseName+".db");
os = new FileOutputStream("/data/data/com.DemoSqlite/databases/"+databaseName+".db");
copyFile(os, is);
}catch (Exception e) {
Log.e("DB", "Database not found", e);
}finally{
try{
if(os != null)
os.close();
if(is != null)
is.close();
} catch (IOException e) {Log.e("DB", "Can't close adapters");}
}
}
private void copyFile(OutputStream os, InputStream is) throws IOException {
byte[] buffer = new byte[1024];
int length;
while((length = is.read(buffer))>0)
os.write(buffer, 0, length);
os.flush();
}
}
我的代码有什么问题?
谢谢
【问题讨论】:
-
您确定您的文件复制工作正常吗?如果您正在创建一个空白数据库,尝试复制它,然后读取它并找到一个空白数据库;那么看来复制代码必须被打破。我敢打赌,您不能像那样复制到数据库文件夹。此外,使用这样的绝对文件路径真的很糟糕。
-
尝试删除项目周围的撇号:Cursor cursor=sqlManager.rawQuery("SELECT * FROM items");
-
同时,我同意@tencent这不是正确的方式。
-
腾讯,复制它正在正确完成,因为我没有得到和异常。 Yury,我试过了,我仍然遇到同样的异常:项目表不存在
-
我建议您事先创建数据库。然后当您的应用程序第一次加载时,将其移动到相关位置。然后每次重新打开应用程序时只需简单地加载数据库(这样您就不会每次都复制数据库)。