从文件中读取和打开Sqlite数据库时出现问题

时间:2012-07-24 11:01:47

标签: android sqlite

我有一个必须从assets文件夹上的.db文件打开sqlitedatabase的应用程序。每次应用程序启动时都必须打开此数据库。

我正在检查一些教程,用于处理android中的sqlite数据库以及从文件中加载sqlite数据库。我在这段代码中合并了所有这些教程,但它不起作用。

我的数据库包含一个名为items的TABLE,里面有一些数据,但是当我从items调用SELECT *语句时,我得到一个异常,告诉我items表不存在:

        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();
}   
}

我的代码有什么问题?

由于

1 个答案:

答案 0 :(得分:1)

替换

dbHelper = new DemoSQLiteHelper(ctx, databaseName, null, 1);

dbHelper = new DemoSQLiteHelper(ctx, databaseName + ".db", null, 1);

SQLiteManager.open()方法中。

虽然您从database复制assets,但您将frases数据库名称传递给SQLiteHelper,而不是frases.db,因此您的助手会使用错误的数据库文件。< / p>

每次实例化database时,您都会从assets复制SQL manager。这是错误的做法。请看一下此示例如何从database https://stackoverflow.com/a/11601770/1300995移动assets