您好我正在尝试在我的应用中使用预装数据库。但是当我运行应用程序时,它会给出错误
sqlite3_open_v2("/data/data/com.example.preloaddatabase/databases/ingredients.db", &handle, 2, NULL) failed
ERROR IN CODE :android.database.sqlite.SQLiteException: unable to open database file
我的数据库帮助程序类是:
class IngredientHelper extends SQLiteOpenHelper {
private static final String DATABASE_PATH = "/data/data/com.example.preloaddatabase/databases/";
private static final String DATABASE_NAME = "ingredients.db";
private static final String TABLE_NAME = "Ingredients";
private static final String COLUMN_ID = "_id";
private static final String COLUMN_TITLE = "ingredient_name";
private static final int SCHEMA_VERSION = 1;
public SQLiteDatabase dbSqlite;
private final Context myContext;
public IngredientHelper(Context context) {
super(context, DATABASE_NAME, null, SCHEMA_VERSION);
this.myContext = context;
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("Create Table Ingredients(_id INTEGER PRIMARY KEY,ingredient_name TEXT)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
public void createDatabase() {
createDB();
}
public void createDB() {
boolean dbExist = DbExists();
if (dbExist) {
this.getReadableDatabase();
copyDataBase();
}
}
private boolean DbExists() {
SQLiteDatabase db = null;
try {
String databasePath = DATABASE_PATH + DATABASE_NAME;
db = SQLiteDatabase.openDatabase(databasePath, null,
SQLiteDatabase.OPEN_READWRITE);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
db.setVersion(1);
}
catch (SQLiteException e) {
Log.e("SqlHelper", "Database Not Found");
}
if (db != null) {
db.close();
}
return db != null ? true : false;
}
private void copyDataBase() {
InputStream iStream = null;
OutputStream oStream = null;
String outFilePath = DATABASE_PATH + DATABASE_NAME;
try {
iStream = myContext.getAssets().open(DATABASE_NAME);
oStream = new FileOutputStream(outFilePath);
byte[] buffer = new byte[2048];
int length;
while ((length = iStream.read(buffer)) > 0) {
oStream.write(buffer, 0, length);
}
oStream.flush();
oStream.close();
iStream.close();
}
catch (IOException e) {
throw new Error("Problem Copying Database From Resource File");
}
}
public void openDatabase() throws SQLException {
String myPath = DATABASE_PATH + DATABASE_NAME;
dbSqlite = SQLiteDatabase.openDatabase(myPath, null,
SQLiteDatabase.OPEN_READWRITE);
}
@Override
public synchronized void close() {
if (dbSqlite != null) {
dbSqlite.close();
}
super.close();
}
public Cursor getCursor() {
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
queryBuilder.setTables(TABLE_NAME);
String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE };
Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn,
null, null, null, null, "ingredient_name ASC");
return mCursor;
}
public String getName(Cursor c) {
return (c.getString(1));
}
}
答案 0 :(得分:3)
步骤1:摆脱以下几行:
public SQLiteDatabase dbSqlite;
private final Context myContext;
第2步:更改getCursor()
以致电getReadableDatabase()
,而不是引用现已删除的dbSqlite
。
步骤3:删除引用dbSqlite
或myContext
的所有其他方法。
步骤4:删除DATABASE_PATH
(不要硬编码路径)。
第5步:删除createDB()
,createDatabase()
,DbExists()
和copyDataBase()
方法。如果您希望尝试使用自己的应用发布数据库,请考虑使用SQLiteAssetHelper
。