2014-02-08 6 views
0

У меня проблема с созданием базы данных SQLLite. Я проверил db или нет, закройте соединение db. Но я не понимаю, где я терпит неудачу или openOrCreateDatabase терпит неудачу.openOrCreateDatabase сбой

... 
public class DBHelper extends SQLiteOpenHelper { 
... 
public DBHelper(Context context) { 
    super(context, DBName, null, version); 
    currentContext = context; 
    if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) 
     cacheDir=new File(android.os.Environment.getExternalStorageDirectory(),context.getString(R.string.cache_dirname)); 
    else 
     cacheDir=context.getCacheDir();  
    if(!cacheDir.exists()) 
     cacheDir.mkdirs(); 
    DBPath=cacheDir.toString()+"/"; 
    createDatabase(); 
} 

private void createDatabase() { 
    boolean dbExists = checkDbExists(); 
    if (dbExists) { 
     // do nothing 
    } else { 
        // **fails here**   
     DB = currentContext.openOrCreateDatabase(DBName, 0, null); 
     ...   
    } 
} 

private boolean checkDbExists() { 
    SQLiteDatabase checkDB = null; 
    try { 
     String myPath = DBPath + DBName; 
     checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); 
    } catch (SQLiteException e) { 
     Log.d("","database doesn't exists"); 
    } 
    if (checkDB != null) { 
     checkDB.close(); 
    } 
    return checkDB != null ? true : false; 
} 

}

Ошибка

Failed to open databse '/storage/emulated/0/My_test/dbtest' 
android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error code (14): Couldn't open database 

Где неисправностью?

ответ

1

Попробуйте один

DBPath = Environment.getDataDirectory().getName()+"//data//com.your.package//databases//"; 

String myPath = DBPath + DBName; 
+1

Да так работает ** DBPATH = "/ данные/данные /" + context.getPackageName() + "/ базы данных /" **; – zond

1

Его failng потому, что вы открываете базу данных в папку по умолчанию, при создании каталогов и проверки базы данных в другом месте.

DB = currentContext.openOrCreateDatabase(DBName, 0, null); 

«DBName» должен быть FULLPATH к вашей базе данных, или он будет создан в папке по умолчанию. Вот код, который я использую для открытия базы данных с переменными местоположениями.

SQLiteDatabase m_db = context.openOrCreateDatabase(
     db_file.getAbsolutePath(), Context.MODE_PRIVATE, null, null); 

Объединить ваш путь + «/» + DBName в полный путь, или вы можете передать его файл, который содержит правильный путь и использовать получить абсолютный путь.

Редактировать: Я заметил, что вы действительно открываете БД, чтобы проверить, существует ли она. Это будет показано, как проверить, существует ли DB для переменного местоположения:

File db_file = new File(folder, dbName); 
boolean dbExists = db_file.exists(); 
+0

DB = currentContext.openOrCreateDatabase (DBPath + DBName, Context.MODE_PRIVATE, null); \t :) но это не помогает. – zond

+0

1. Проверьте, успешно ли ваш .mkdirs, бросьте, если это не так. 2. убедитесь, что на самом деле вы выделили пространство sd-карты, по умолчанию это не пробел. 3. убедитесь, что ошибка происходит там, где вы считаете. Я не вижу полный логарифм и не вижу, что «база данных не существует», которую вы должны получать в checkDBexists. Кроме того, вы не должны пытаться открыть БД, чтобы проверить, существует ли она, см. Мой код выше, как проверить его. – NameSpace

Смежные вопросы