web-dev-qa-db-fra.com

Android SQLiteOpenHelper ne peut pas ouvrir le fichier de base de données

Je sais que le sujet a été discuté avant… .. Mais je ne trouve pas de solution à mon problème, je vais donc le lui poser une fois de plus… .. J'ai un problème pour créer la base de données… .. J'ai copié l'implémentation de SQLiteOpenHelper:

public class DBCreator extends SQLiteOpenHelper 
{
    private static final String DATABASE_NAME = "servision.db";
    private static final int DATABASE_VERSION = 1;


    private static final String INFO_TABLE ="create table INFO(key text,value text);";
    public static final String GATEWAYS_TABLE = "GATEWAYS";

    // Table name
    public static final String TABLE = "events";

    // Columns
    public static final String TIME = "time";
    public static final String TITLE = "title";

    public DBCreator(Context context) 
    {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) 
    {
        try
        {
            String gatewaytablescript ="create table" +GATEWAYS_TABLE+"(" +
            "id int primary key, " +
            "Host text not null," +
            "port int not null," +
            "username text," +
            "password text,"+
            "useproxy int," +
            "proxyHost text," +
            "proxyPort port," +
            "desc text," +
            "secondaryip text," +
            "secondaryport int," +
            "timezone int," +
            "encryption int," +
            "customkey text" +
            ");";

            Log.d("DBCreator", "Creating " + GATEWAYS_TABLE + "table");
            db.execSQL(gatewaytablescript);

            String infotablescript ="create table " + INFO_TABLE + "(key text,value text);";
            Log.d("DBCreator", "Creating " + INFO_TABLE + "table");
            db.execSQL(infotablescript);

        }
        catch(SQLException ex)
        {
            Log.d("DBCreator", "onCreate exception " +ex.getMessage()); 
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    {
        Log.d("EventsData", "onUpgrade");
        if (oldVersion >= newVersion)
            return;


    }
}

et je le crée à partir de l'activité principale méthode onCreate comme ceci.

DBCreator db =new DBCreator(this);
db.getReadableDatabase();

dans logcat je reçois les informations suivantes:

06-01 17:31:15.523: INFO/global(2470): Default buffer size used in BufferedInputStream constructor. It would be better to be explicit if an 8k buffer is required.
06-01 17:31:15.652: INFO/Database(4160): sqlite returned: error code = 14, msg = cannot open file at source line 25467
06-01 17:31:15.652: ERROR/Database(4160): sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 6, NULL) failed
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): Couldn't open servision.db for writing (will try read-only):
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160): Android.database.sqlite.SQLiteException: unable to open database file
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.Java:1921)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.Java:883)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.Java:960)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.Java:953)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.app.ContextImpl.openOrCreateDatabase(ContextImpl.Java:602)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.Java:203)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.Java:98)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.Java:158)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at com.servision.svclient.Main.onCreate(Main.Java:52)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.app.Instrumentation.callActivityOnCreate(Instrumentation.Java:1049)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2627)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2679)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.app.ActivityThread.access$2300(ActivityThread.Java:125)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:2033)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.os.Handler.dispatchMessage(Handler.Java:99)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.os.Looper.loop(Looper.Java:123)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Android.app.ActivityThread.main(ActivityThread.Java:4627)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Java.lang.reflect.Method.invokeNative(Native Method)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at Java.lang.reflect.Method.invoke(Method.Java:521)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:858)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
06-01 17:31:15.722: ERROR/SQLiteOpenHelper(4160):     at dalvik.system.NativeStart.main(Native Method)
06-01 17:31:15.738: INFO/Database(4160): sqlite returned: error code = 14, msg = cannot open file at source line 25467
06-01 17:31:15.738: ERROR/Database(4160): sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 1, NULL) failed

onCreate de DBCreator n'est jamais appelé . Je lance un programme sur Galaxy S en mode débogage depuis Eclipse . Me manque-t-il des autorisations? Peut-être que le contexte n'est pas bon ou quelque chose?

16
AlexS

En ce qui concerne les erreurs sqlite returned: error code = 14, msg = cannot open file at source line 25467 et sqlite3_open_v2("/data/data/com.servision.svclient/databases/servision.db", &handle, 1, NULL) failed, cela semble être dû au fait qu'il n'y a pas de base de données et qu'Android tente d'en créer une.

Quelques lectures ici

http://androidblogger.blogspot.com/2011/02/instable-Android-and-unable-to-open.html

http://www.itsalif.info/content/check-if-database-exist-Android-sqlite3openv2-failed

http://code.google.com/p/Android/issues/detail?id=949

7
georgiecasey

vérifier les autorisations dans votre manifeste add 

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE"/>
6
user2307183

Quand j'ai eu cette erreur, j'ai utilisé ce code pour mon constructeur 

public DBClass(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    context.openOrCreateDatabase(DATABASE_NAME, context.MODE_PRIVATE, null);
}
4
Ameen Maheen

J'avais un problème avec mon application, où le fait de modifier mon fichier de base de données avec une ancienne base de données après une réinstallation de l'application m'avait donné cette erreur le propriétaire des fichiers de l'application réinstallée. Nous avons donc résolu le problème en donnant au nouveau fichier toutes les autorisations (777) pour qu'il puisse également être lu par d'autres utilisateurs.

A la fin, assurez-vous que vous n'avez pas de problème d'autorisations de fichiers.

1
Pek Ifly

J'ai eu un problème similaire et voici comment je l'ai résolu:

https://stackoverflow.com/a/22743794/1947094

Pour résumer:

adb Shell
cd /data/data/YOUR.APP.PACKAGE/databases/
ls

Cela vous donne une liste des bases de données utilisées par votre application.

cp your_database.db your_database.db_backup
rm your_database.db
0
mimetist