IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

[SQLite] Read-only file system


Sujet :

Android

  1. #1
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut [SQLite] Read-only file system
    Salut à tous,

    Je viens vers vous pour un problème certainement tout bête...

    J'essaye de créer une base de données SQLite sur ma carte SD. Pour cela, j'ai rajouté la ligne suivante dans le manifest :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    Et du côté de mon ordre de création :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    String base = Environment.getExternalStorageDirectory().getPath() + "/mabase.db";
    db.openDatabase(base, null, SQLiteDatabase.CREATE_IF_NECESSARY);
    Cependant, côté LogCat, il me dit :

    dbopen(): path = :memory:, flag = 6, cannot stat file, error message: Read-only file system
    dbopen(): path = /mnt/sdcard/mabase.db, flag = 6, cannot stat file, error message: No such file or directory
    Je ne sais plus quoi faire... Si je ne précise pas le chemin, il va bien me créer ma base mais dans le dossier "data" du système auquel je n'ai pas accès (root nécessaire...).

    Help please Thanks

  2. #2
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Pour faire suite à mon message, j'ai oublié de préciser que le fichier ".db" est bien créé sur le support SD. Et même si je change de dossier, il en créé un autre.

    Malgré ça, il n'arrive pas à écrire dessus lorsque j'utilise mes instructions "CREATE" via "ExecSQL"...

  3. #3
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Je ne sais pas pour quelle obscure raison mais à présent je ne suis même plus en mesure de créer le fichier de base de données, que ce soit dans l'emplacement par défaut d'Android ou dans un emplacement personnalisé.

    Toujours cette fichue erreur "Read-only file system" !

    Pour info voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public class SQLiteBDD extends SQLiteOpenHelper{
    	private String FileName = "";
     
    	public SQLiteBDD(Context context, String name, CursorFactory factory, int version){
    		super(context,name,factory,version);
    		FileName = name;
    	}
     
    	@Override
    	public void onCreate(SQLiteDatabase db){
    		db.execSQL("CREATION DES TABLES");
    	}
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    		db.execSQL("");
    	}
     
    	public SQLiteDatabase getWritableDatabase(){
    		 return SQLiteDatabase.openDatabase(FileName, null, SQLiteDatabase.OPEN_READWRITE);
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class MonAppliDataBase {
     
    	private SQLiteDatabase db;
    	private SQLiteBDD data;
     
    	public MonAppliDataBase(Context context){
    		data = new SQLiteBDD(context, "monappli.db", null, 1);
    	}
    	public boolean open(){
    		db = data.getWritableDatabase();
    		return true;
    	}
    	public void close(){
    		db.close();
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    MonAppliDataBase db = new BudgestDataBase(getBaseContext());
    db.open();
    db.close();
    Et le LogCat :

    dbopen(): path = monappli.db, flag = 2, cannot stat file, error message: Read-only file system
    sqlite returned: error code = 14, msg = cannot open file at line 27206 of [42537b6056]
    dbopen(): sqlite3_open_v2("monappli.db", &handle, 2, NULL) failed
    dbopen(): errno = 2, error message = No such file or directory
    J'ai passé des heures et des heures sur google pour trouver des solutions en lien avec ce message d'erreur : rien !

    Pourtant, je doute être le seul à rencontrer ce genre de problème...

  4. #4
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Je viens de tester une simple écriture de fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    FileOutputStream fOut = null;
    OutputStreamWriter osw = null;
     
    try{
       fOut = getBaseContext().openFileOutput("settings.dat",MODE_APPEND);
       osw = new OutputStreamWriter(fOut);
       osw.write("toto");
       osw.flush();
     
       Toast.makeText(getBaseContext(), "Settings saved",Toast.LENGTH_SHORT).show();
    }
    catch (Exception e) {
       Toast.makeText(getBaseContext(), "Settings not saved",Toast.LENGTH_SHORT).show();
    }
    finally {
       try {
          osw.close();
          fOut.close();
       } catch (IOException e) {
          Toast.makeText(getBaseContext(), "Settings not saved",Toast.LENGTH_SHORT).show();
       }
    }
    Aucun problème : fichier bien ajouté dans un sous dossiers "files" du dossier "data". Il ne s'agit donc pas d'un problème de droit mais bien d'un problème avec SQLite...

  5. #5
    Membre régulier Avatar de windmastr26
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 234
    Points : 108
    Points
    108
    Par défaut
    Bon problème résolu !

    Il fallait utiliser la méthode "openDataBase" à partir du contexte et non pas à partir de la classe (ce qui en y réfléchissant était stupide de ma part).

    J'ai du coup opté pour "openOrCreateDatabase" afin de créer la base sur la carte SD. Il faut donc modifier la méthode "getWritableDatabase()" ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return c.openOrCreateDatabase(Environment.getExternalStorageDirectory() + "/" + FileName, 0, null);
    Où "c" représente le contexte passé au constructeur de la classe "SQLiteBDD" et qu'il faudra bien entendu conserver dans une propriété privée de l'objet.

    Bonne nuit !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. datafile number not processed because file is read-only
    Par medlfi dans le forum Administration
    Réponses: 1
    Dernier message: 25/01/2010, 17h50
  2. 550 read only file system ?!
    Par reega dans le forum Dreamweaver
    Réponses: 2
    Dernier message: 27/11/2009, 21h58
  3. Problème de mise à jour - 550 read only file system
    Par Chris666 dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 23/11/2009, 09h56
  4. Réponses: 3
    Dernier message: 11/03/2008, 01h22
  5. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo