Android不会创建数据库文件

时间:2013-03-28 17:09:52

标签: android database sqlite

我有一个奇怪的问题,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)

0 个答案:

没有答案