我有一个奇怪的问题,Android(2.2)没有创建数据库文件。
我已经搜索过,所有的问题和解决方案到目前为止都指向onCreate()没有被调用,我的问题就是在此之前,甚至没有数据库(/data/data/my.app/databases)文件得到创建
首先,此代码已在其他2个应用中运行。应用程序存在于设备上,然后我添加了这个数据库代码,没问题,数据库被创建并运行。 这一次,我再次将代码复制到第3个应用程序,每当它运行时,我得到:
E/AndroidRuntime(15337): FATAL EXCEPTION: main
E/AndroidRuntime(15337): java.lang.RuntimeException: Unable to start activity ComponentInfo{my.app/my.app.myactivity}: android.database.sqlite.SQLiteException: unable to open database file
E/AndroidRuntime(15337): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(15337): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(15337): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(15337): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(15337): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(15337): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(15337): at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(15337): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(15337): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(15337): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(15337): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(15337): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(15337): Caused by: android.database.sqlite.SQLiteException: unable to open database file
E/AndroidRuntime(15337): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
E/AndroidRuntime(15337): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1812)
E/AndroidRuntime(15337): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
E/AndroidRuntime(15337): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
E/AndroidRuntime(15337): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
E/AndroidRuntime(15337): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
E/AndroidRuntime(15337): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
E/AndroidRuntime(15337): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
E/AndroidRuntime(15337): at my.app.MyDbAdapter.open(SvpDbAdapter.java:78)
E/AndroidRuntime(15337): at my.app.myactivity.onCreate(ShowRemoteVideo.java:109)
E/AndroidRuntime(15337): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(15337): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(15337): ... 11 more
但如果我先从设备上卸载应用程序,然后从Eclipse重新安装,一切都按预期工作。但是,其他应用程序在没有这样做的情况下工作,并且这个应用程序也需要(并且应该),因为这是一个专门的设备,将通过互联网获得更新。我们不能指望用户首先卸载(也不能)。
以下是我的代码,相关部分。只是没有意义。 首先是db helper:
package my.app;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class MyDbAdapter{
public static final String KEY_MOVIE_PATH = "full_path";
public static final String KEY_MOVIE_MARKER = "marker";
public static final String TAG = "MyDbAdapter";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private static final String MYDB_MOVIES_CREATE =
"create table movies (full_path text, marker integer default 0);";
private static final String DATABASE_NAME = "svpdata";
private static final String MOVIE_TABLE = "movies";
private static final int DATABASE_VERSION = 1;
private final Context mCtx;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context, int dbVersion, String dbName){
super(context, dbName, null, dbVersion);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(MYDB_MOVIES_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
//Only for version 1, remove after incrementing verison.
db.execSQL("drop table if exists "+MOVIE_TABLE);
onCreate(db);
}
}
/**
* Constructor
*
* @param ctx the Context within which to work
*/
public MyDbAdapter(Context ctx){
this.mCtx = ctx;
}
/**
* Open the db. If it cannot be opened, try to create a new instance of the db. If it cannot be created, throw exception
*
* @return this
*
* @throws SQLException
*/
public SvpDbAdapter open() throws SQLException{
mDbHelper = new DatabaseHelper(mCtx, DATABASE_VERSION, DATABASE_NAME);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close(){
mDbHelper.close();
}
//Bunch more methods left out that are not relevant at this point...
}
然后是我的活动的一部分,它扩展了基本活动:
private SvpDbAdapter svpDatabaseHelper;@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
svpDatabaseHelper = new SvpDbAdapter(this);
svpDatabaseHelper.open();
//Some other non-relevant stuff...
}
编辑 - 我错过了上面显示的logcat的这些行!
03-28 11:35:45.316: I/Database(5483): sqlite returned: error code = 14, msg = cannot open file at source line 25467
03-28 11:35:45.316: E/Database(5483): sqlite3_open_v2("/data/data/us.purple.jambo.screensaver/databases/svpssdata", &handle, 6, NULL) failed
03-28 11:35:45.316: D/AndroidRuntime(5483): Shutting down VM
03-28 11:35:45.316: W/dalvikvm(5483): threadid=1: thread exiting with uncaught exception (group=0x4001d840)