0

assets フォルダーの .db ファイルから sqlitedatabase を開く必要があるアプリがあります。このデータベースは、アプリを起動するたびに開く必要があります。

Androidでsqliteデータベースを処理し、ファイルからsqliteデータベースをロードするためのチュートリアルをいくつかチェックしています。これらすべてのチュートリアルをこのコードにマージしましたが、機能しません。

私のデータベースには、内部にいくつかのデータがある TABLE が含まれていますがitems、 SELECT * 文を呼び出すと、itemsitems テーブルが存在しないことを示す例外が発生しました:

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

私のコードで何が間違っていますか?

ありがとう

4

1 に答える 1

1

交換

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

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

あなたのSQLiteManager.open()方法で。

からコピーdatabaseしますが、データベース名を にassets渡します。ヘルパーが間違ったデータベース ファイルを使用するわけではありません。frasesSQLiteHelperfrases.db

をインスタンス化するたびにdatabasefromをコピーしています。それは間違ったアプローチです。https://stackoverflow.com/a/11601770/1300995から移動する方法のこの例を見てください。assetsSQL managerdatabaseassets

于 2012-07-24T11:48:52.900 に答える