我有一个必须从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();
}
}
我的代码有什么问题?
由于
答案 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
。