第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

具有完全限定的數(shù)據(jù)庫路徑名的SQLiteOpenHelper問題

具有完全限定的數(shù)據(jù)庫路徑名的SQLiteOpenHelper問題

梵蒂岡之花 2019-10-18 10:26:28
在我的應(yīng)用中,我使用...myFilesDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()                      + "/Android/data/" + packageName + "/files");myFilesDir.mkdirs();很好,最終的路徑是.../mnt/sdcard/Android/data/com.mycompany.myApp/files我需要一個(gè)要存儲在SD卡上的SQLite數(shù)據(jù)庫,因此我按如下方式擴(kuò)展了SQLiteOpenHelper ...public class myDbHelper extends SQLiteOpenHelper {    public myDbHelper(Context context, String name, CursorFactory factory, int version) {        // NOTE I prefix the full path of my files directory to 'name'        super(context, myFilesDir + "/" + name, factory, version);    }    @Override    public void onCreate(SQLiteDatabase db) {        // Create tables and populate with default data...    }}到目前為止一切順利-我第一次打電話getReadableDatabase()或getWriteableDatabase()在SD卡上創(chuàng)建了一個(gè)空DB并將其onCreate()填充。所以這就是問題所在-該應(yīng)用程序可能需要5到6個(gè)人進(jìn)行Beta測試,并且像我一樣,他們正在運(yùn)行Android v2.2,并且一切正常。我有一個(gè)測試器,但是正在運(yùn)行v2.1,并且myDbHelper在首次使用時(shí)嘗試創(chuàng)建數(shù)據(jù)庫時(shí),它因以下原因而崩潰...E/AndroidRuntime( 3941): Caused by: java.lang.IllegalArgumentException: File /nand/Android/data/com.mycompany.myApp/files/myApp-DB.db3 contains a path separatorE/AndroidRuntime( 3941): at android.app.ApplicationContext.makeFilename(ApplicationContext.java:1445)E/AndroidRuntime( 3941): at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:473)E/AndroidRuntime( 3941): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)E/AndroidRuntime( 3941): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)E/AndroidRuntime( 3941): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)文件目錄的路徑是一個(gè)奇數(shù)(“ / nand”),因?yàn)樗莾?nèi)部存儲器,盡管不是手機(jī)自己的內(nèi)部存儲器-但這是getExternalStorageDirectory()此設(shè)備返回的路徑。我可以看到三個(gè)可能的答案...盡管在v2.2上可以接受,但是不建議為數(shù)據(jù)庫名稱指定完全限定的路徑,并且在早期版本中會失敗SD卡存儲可接受完全限定的路徑,但是“ / nand”路徑被解釋為“內(nèi)部”路徑,在這種情況下,僅相對路徑可接受我完全想不到的其他東西如果上述任何一項(xiàng)或全部適用,那么如果有人可以幫助我解決這個(gè)問題,我將不勝感激。謝謝。
查看完整描述

3 回答

?
撒科打諢

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊

從歷史上看,您無法通過使用路徑SQLiteOpenHelper。它僅適用于簡單的文件名。我沒有意識到他們放寬了Android 2.2中的限制。


如果您希望使用SD卡上的數(shù)據(jù)庫,并且希望支持Android 2.1及更低版本,則不能使用SQLiteOpenHelper。



查看完整回答
反對 回復(fù) 2019-10-18
?
拉莫斯之舞

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊

k3b的答案很棒。它使我工作。但是,在使用API級別11或更高版本的設(shè)備上,您可能會看到它停止工作。這是因?yàn)樘砑恿诵掳姹镜膐penOrCreateDatabase()方法?,F(xiàn)在,它包含以下簽名:


openDatabase(String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler)

在某些具有此方法的設(shè)備上,這似乎是默認(rèn)調(diào)用的方法。


為了使此方法在這些設(shè)備上起作用,您需要進(jìn)行以下更改:


首先,編輯您現(xiàn)有的方法,使其僅將調(diào)用結(jié)果返回給新方法。


@Override

public SQLiteDatabase openOrCreateDatabase(String name, int mode,

        CursorFactory factory) {

    return openOrCreateDatabase(name, mode, factory, null);


}

其次,使用以下代碼添加新的替代。


@Override

public SQLiteDatabase openOrCreateDatabase(String name, int mode, CursorFactory factory, DatabaseErrorHandler errorHandler) {

    SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name).getAbsolutePath(),null,errorHandler);


    return result;

}

該代碼與k3b的代碼非常相似,但是請注意,SQLiteDatabase.openOrCreateDatabase采用String而不是File,并且我使用了允許DatabaseErrorHandler對象的版本。


查看完整回答
反對 回復(fù) 2019-10-18
  • 3 回答
  • 0 關(guān)注
  • 690 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號