0

答えはこのスレッドにあります: Sqlite issues with HTC Desire HD、@Vikalp Patel に感謝

私は本当に簡単なことをしています.sdcardからsqliteデータベースを開き、そこからいくつかのものを読み取ります. たとえば、テーブルのリスト:

これは私の DataBaseHelper クラスです (非常に単純です):

public class DataBaseHelper extends SQLiteOpenHelper{
    static Context mContext;
    private static SQLiteDatabase mDb;  

    public DataBaseHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }           

//skip the overriden methods

    public void OpenDataBase(String path, String name){                     
        mDb = SQLiteDatabase.openDatabase(path + name, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);    

    }

    public Cursor GetTables(){      
        return mDb.rawQuery("SELECT name FROM sqlite_master WHERE type='table' ORDER BY name", null);
    }

}

このコードを呼び出すと

mDbPath = Environment.getExternalStorageDirectory() + "/test_db/";
            mDbName = "db.sqlite";
            mDbHelper = new DataBaseHelper(mContext,mDbPath+mDbName,null,1);
            mDbHelper.OpenDataBase(mDbPath, mDbName);
            Toast.makeText(mContext, String.format("Database %s%s successfully opened", new Object[]{mDbPath, mDbName}), Toast.LENGTH_LONG).show();
            Cursor cursor = mDbHelper.GetTables();

返されたカーソルにはテーブルのリストが含まれています。できます。私を夢中にさせる唯一のものは、ログのエラーメッセージです:

01-05 17:09:44.250: D/Database(21131): dbopen(): path = /mnt/sdcard/test_db/db.sqlite, flag = 2, file size = 3072
01-05 17:09:44.260: D/Database(21131): dbopen(): path = /mnt/sdcard/test_db/db.sqlite, mode: delete, disk free size: 3106 M, handle: 0x359260
01-05 17:09:44.260: I/Database(21131): sqlite returned: error code = 8, msg = statement aborts at 1: [pragma journal_mode = WAL;] 
01-05 17:09:44.260: W/Database(21131): dbopen(): sqlite3_exec to set journal_mode to WAL for /mnt/sdcard/test_db/db.sqlite failed
01-05 17:09:44.260: E/Database(21131): dbopen(): errno = 2, error message = No such file or directory

エラーは OpenDataBase メソッドで発生します。

このエラーが表示される理由と、何が間違っているのかを誰かが理解するのを手伝ってくれますか? ありがとう。

編集:私はAndroid 2.3、HTC Desire HDでテストしています

4

1 に答える 1

0

まず、Android ではハードコードされたパスを使用しないでください。すべてのデバイスで同じであるとは限りません。

使ってみてgetDatabasePath("db_sqlite.db").getAbsolutePath();

于 2013-01-28T11:40:28.380 に答える