【问题标题】:Problems reading and opening a Sqlite database from a file从文件读取和打开 Sqlite 数据库时出现问题
【发布时间】: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,我试过了,我仍然遇到同样的异常:项目表不存在
  • 我建议您事先创建数据库。然后当您的应用程序第一次加载时,将其移动到相关位置。然后每次重新打开应用程序时只需简单地加载数据库(这样您就不会每次都复制数据库)。

标签: android sqlite


【解决方案1】:

替换

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

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

在您的 SQLiteManager.open() 方法中。

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

每次实例化 SQL manager 时,都会从 assets 复制 database。那是错误的做法。看看这个例子如何将你的databaseassets移动到https://stackoverflow.com/a/11601770/1300995

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    相关资源
    最近更新 更多