roblema @SQLiteOpenHelper com o nome completo do caminho do banco de dados
No meu aplicativo, eu uso ...
myFilesDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/Android/data/" + packageName + "/files");
myFilesDir.mkdirs();
Isso é bom e o caminho resultante é ...
/mnt/sdcard/Android/data/com.mycompany.myApp/files
Preciso de um banco de dados SQLite que desejo armazenar no cartão SD, estendo o SQLiteOpenHelper da seguinte forma ...
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...
}
}
Tão longe tão bom - a primeira vez que eu ligogetReadableDatabase()
ougetWriteableDatabase()
o banco de dados vazio é criado no cartão SD eonCreate()
preenche.
Então, aqui está o problema - o aplicativo está em teste beta com talvez 5 ou 6 pessoas e, como eu, está executando o Android v2.2 e tudo funciona bem. Eu tenho um testador, no entanto, executando a v2.1 e quandomyDbHelper
tenta criar o banco de dados no primeiro uso, ele trava com o seguinte ...
E/AndroidRuntime( 3941): Caused by: java.lang.IllegalArgumentException: File /nand/Android/data/com.mycompany.myApp/files/myApp-DB.db3 contains a path separator
E/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)
O caminho para o diretório de arquivos é estranho ("/ nand"), pois é a memória interna, embora não seja a memória interna do telefone - mas é o caminho retornado porgetExternalStorageDirectory()
para este dispositivo.
Posso ver três respostas possíveis ...
Embora aceitável na v2.2, a especificação de um caminho completo para o nome do banco de dados não é recomendada e falhará nas versões anteriores Caminhos totalmente qualificados são aceitáveis para armazenamento do cartão SD, mas o caminho "/ nand" está sendo interpretado como 'interno' e, neste caso, somente caminhos relativos são aceitáveisAlgo mais que estou perdendo completamenteSe algum ou todos os itens acima se aplicarem, eu apreciaria se alguém pudesse ajudar com a maneira como eu deveria abordar iss
Obrigado