2014-10-30 68 views
1

我的目標是構建定製版本的SQLite(特別是R-Tree啓用)以包含在我的Android項目中。動機源於:Android定製SQLite構建 - 無法打開數據庫

Android SQLite R-Tree - How to install module?

的SQLite在如何做到這一點一些指令:

http://www.sqlite.org/android/doc/trunk/www/index.wiki

我已經編譯SQLite和成功列入我的項目共享庫。我遇到的問題是,只要我調用諸如getReadableDatabase()getWriteableDatabase()之類的操作,就會收到SQLiteCantOpenDatabaseException。

import org.sqlite.database.sqlite.SQLiteDatabase;

import org.sqlite.database.sqlite.SQLiteOpenHelper;

代替:

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

要注意,我用的是很重要的爲了使用通過NDK和JNI的自定義SQLite構建。

MySQLiteHelper:

public class MySQLiteHelper extends SQLiteOpenHelper { 

    static { 
     System.loadLibrary("sqliteX"); 
    } 

    private static final String DATABASE_NAME = "mydata.db"; 
    private static final int DATABASE_VERSION = 1; 
    Context myContext; 

    public MySQLiteHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     myContext = context; 
    } 

    public void getEntry(){ 
     SQLiteDatabase db = this.getReadableDatabase(); 
     db.close(); 
    } 

    public void createEntry(){ 
     // 1. get reference to writable DB 
     SQLiteDatabase db = this.getWritableDatabase(); 
     //... 
     //... 
     db.close(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase database) { 
     String create_rtree = "CREATE VIRTUAL TABLE demo_index USING rtree(\n" + 
       " id,    -- Integer primary key\n" + 
       " minX, maxX,  -- Minimum and maximum X coordinate\n" + 
       " minY, maxY  -- Minimum and maximum Y coordinate\n" + 
       ");"; 

     database.execSQL(create_rtree); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(MySQLiteHelper.class.getName(), 
      "Upgrading database from version " + oldVersion + " to " 
        + newVersion + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS " + "demo_index"); 
     onCreate(db); 
    } 

} 

主要活動:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    MySQLiteHelper helper = new MySQLiteHelper(this); 
    helper.createEntry(); 
    setContentView(R.layout.activity_my); 
} 

堆棧跟蹤:

10-29 13:45:38.356 2360-2360/com.example.nathanielwendt.lstrtree E/SQLiteLog﹕ (14) os_unix.c:30589: (2) open(//arrrr.db) - 
10-29 13:45:38.376 2360-2360/com.example.nathanielwendt.lstrtree E/SQLiteDatabase﹕ Failed to open database 'arrrr.db'. 
    org.sqlite.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database 
     at org.sqlite.database.sqlite.SQLiteConnection.nativeOpen(Native Method) 
     at org.sqlite.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:217) 
     at org.sqlite.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:201) 
     at  org.sqlite.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:467) 
     at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:189) 
     at org.sqlite.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:181) 
     at org.sqlite.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:809) 
     at org.sqlite.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:794) 
     at org.sqlite.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:699) 
     at org.sqlite.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:722) 
     at org.sqlite.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:228) 
     at org.sqlite.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:168) 
     at com.example.nathanielwendt.lstrtree.MySQLiteHelper.createEntry(MySQLiteHelper.java:65) 
     at com.example.nathanielwendt.lstrtree.MyActivity.onCreate(MyActivity.java:25) 

我在這裏就沒有見過這樣幾個職位這個相同的異常,但他們似乎都涉及到進口數據庫從別的地方在磁盤上,他們沒有正確設置文件路徑。這似乎是最相關的職位:Android SQLiteOpenHelper cannot open database file,但沒有任何建議工作。

我已經嘗試過使用2種不同的手機和模擬器,並且收到相同的錯誤。此外,我已經用默認的android sqlite導入代替了上面討論的導​​入,並且它工作正常(因爲我沒有嘗試創建R-Tree,因爲它沒有包含在默認的Android SQLite安裝中)。將數據庫目錄和.db文件的權限更改爲777並未解決問題,也沒有將WRITE_PERMISSION添加到我的清單中。

+0

你實際嘗試訪問什麼路徑? – 2014-10-30 02:22:06

回答

4

這是SQLite Android綁定中的不兼容性。

原生Android的代碼是這樣開的數據庫:

db = mContext.openOrCreateDatabase(mName, mEnableWriteAheadLogging ? 
     Context.MODE_ENABLE_WRITE_AHEAD_LOGGING : 0, 
     mFactory, mErrorHandler); 

org.sqlite.database.sqlite.SQLiteOpenHelper不使用情境:

db = SQLiteDatabase.openOrCreateDatabase(
     mName, mFactory, mErrorHandler 
); 

這意味着數據庫路徑不預先考慮到數據庫名稱。

使用這樣得到數據庫的完整路徑:

String path = context.getDatabasePath(DATABASE_NAME).getPath(); 

,並使用該數據庫名稱。

+0

完美作品,謝謝! – 2014-10-30 16:41:13