Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Android] Base SQLite avec tables vides...

...alors que tables pleines dans le fichier

    29 août 2012 à 11:34:01

    Salut à tous!

    Voilà, dans le cadre d'une application presque terminée (pour info, une application d'accès à distance aux fichiers via VPN, Dropbox, FTP et SVN), j'essaie d'intégrer une mini base de données pour gérer des profils.

    J'ai donc suivi ce tuto à la lettre : tuto sqlite base existante

    en parallèle de ceux-ci :

    tutomobile
    tuto sqlite base existante 2

    Ce qui donne ces classes :

    DataBaseHelper

    package motor;
    
    import android.database.sqlite.SQLiteOpenHelper;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteException;
    import android.util.Log;
    
    public class DataBaseHelper extends SQLiteOpenHelper{
        
        //Le path des bases du system Android (attention au nom du package de l'appli).
        private static String DB_PATH = "/data/data/asknapp.Repoman/databases/";
        //nom de la base
        private static String DB_NAME = "repoman.db";
        // la base
        private SQLiteDatabase myDataBase;
        // le context
        private final Context myContext;
        
     
        /**
         * Constructeur
         *
         * @param context
         */
        public DataBaseHelper(Context context) {
     
            super(context, DB_NAME, null, 1);
            this.myContext = context;
        }   
        
     
        /**
         * On cré une base vide dans le system Android et on réécris dessus.
         * */
        public void createDataBase() throws IOException{
     
            boolean dbExist = checkDataBase();
     
            if(dbExist){
            	Log.e("DBState", "exists!");
                //On fait rien - La base existe déja.
            }else{
     
                //By calling this method and empty database will be created into the default system path
                   //of your application so we are gonna be able to overwrite that database with our database.
                this.getReadableDatabase();
     
                try {
                
                    //Copie de la base
                    copyDataBase();
     
                } catch (IOException e) {
     
                    throw new Error("Erreur de copie de la base !");
     
                }
            }
     
        }
        
     
        /**
         * On Check la base pour voir si elle existe ou pas
         *  
         * @return true si la base existe, false si elle existe pas.
         */
        private boolean checkDataBase(){
     
            SQLiteDatabase checkDB = null;
     
            try{
                String myPath = DB_PATH + DB_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
     
            }catch(SQLiteException e){
     
                //Oups pas de base...
     
            }
     
            if(checkDB != null){
     
                checkDB.close();
     
            }
            
            //On retourn le booléen
     
            return checkDB != null ? true : false;
        }
        
        
     
        /**
         * On copie la base depuis le dossier assets dans le dossier system des bases sous android dans la base vide fraichement créé.
         *
         * */
        private void copyDataBase() throws IOException{
     
            //On ouvre la base locale
            InputStream myInput = myContext.getAssets().open(DB_NAME);
     
            // On choisi l'endroit
            String outFileName = DB_PATH + DB_NAME;
     
            //On ouvre la base vide
            OutputStream myOutput = new FileOutputStream(outFileName);
     
            //On transfert...
            byte[] buffer = new byte[1024];
            int length;
            while ((length = myInput.read(buffer))>0){
                myOutput.write(buffer, 0, length);
            }
     
            //On ferme ...
            myOutput.flush();
            myOutput.close();
            myInput.close();
     
        }
        
        
        /**
         *Fonction pour acceder à la base en mode lecture/écriture
         **/
        public void openDataBase() throws SQLException{
     
            //on ouvre la base
            String myPath = DB_PATH + DB_NAME;
            myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
     
        }
     
        @Override
        public synchronized void close() {
     
                if(myDataBase != null)
                    myDataBase.close();
     
                super.close();
     
        }
     
        @Override
        public void onCreate(SQLiteDatabase db) {
            // On ne crées pas de base
        }
     
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // pas de mis a jour
        }
        
        
        // developper vos methodes d'acces à la base que vous appelerez dans la Main ETC....
     
           
    }
    


    Profile_BDD:

    package motor;
    
    import java.util.ArrayList;
    import java.util.LinkedList;
    
    import android.content.Context;
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.util.Log;
    
    public class Profile_BDD {
    	private static final int VERSION_BDD = 1;
    	private static final String NOM_BDD = "repoman.db";
     
    	private static final String TABLE_PROFILE = "profile";
    	private static final String COL_NAME = "_name";
    	private static final int NUM_COL_NAME = 0;
    	private static final String COL_PROTOCOL = "_protocol";
    	private static final int NUM_COL_PROTOCOL = 1;
    	private static final String COL_FIELDS = "fields";
    	private static final int NUM_COL_FIELDS = 2;
    	private SQLiteDatabase bdd;
    	private DataBaseHelper maBaseSQLite;
    	
    	public Profile_BDD(Context context) throws Exception{
    		Log.e("CONSTRUCT","???");
    		maBaseSQLite = new DataBaseHelper(context);
    		maBaseSQLite.createDataBase();
    		bdd = maBaseSQLite.getWritableDatabase();
    		Log.e("CONSTRUCT","OK");
    		
    	}
    	
    	public LinkedList<Profile_FTP> getFTPProfiles(){
    		Cursor c = bdd.query(TABLE_PROFILE, new String[]{COL_NAME, COL_PROTOCOL, COL_FIELDS}, null, null, null, null, null);
    		LinkedList<Profile_FTP> profiles = new LinkedList<Profile_FTP>();
    		Log.e("SIZE_PROF", "" + c.getCount());
    		if (c.getCount() == 0){
    			return profiles;
    		}
    		
    		c.moveToFirst();
    		String name = c.getString(NUM_COL_NAME);
    		String protocol = c.getString(NUM_COL_PROTOCOL);
    		String fields = c.getString(NUM_COL_FIELDS);
    		
    		profiles.add(new Profile_FTP(name, fields));
    		return profiles;
    	}
    	
    }
    


    et le morceau de code qui invoque tout ça :
    profile_bdd = new Profile_BDD(getMe());
    profils_ftp = profile_bdd.getFTPProfiles();
    


    Donc en fait, la connexion à la base se fait bien ainsi que la requête (en effet il suffit que je modifie le nom de la table pour une qui existe pas pour qu'il lance une erreur, alors que tout est normal quand je mets le bon nom), par contre... 0 résultat!!! (dans le sens où le Cursor renvoie 0 ligne avec la méthode getCount !)

    Et pourtant, dans le fichier cible (repoman.db), il y a bien une ligne d'enregistrée!! et il s'agit bien du même fichier.

    Ah et la table android_metadata a bien été mise également.

    Je n'y comprends vraiment rien... merci d'avance pour l'aide :)

    Edit : Et là, quand je teste la table android_metadata, il me retourne une seule ligne, alors qu'il y en a actuellement deux.

    Edit 2 : OK, problème résolu finalement. En fait, à chaque compilation, la base de données n'est pas réactualisé si l'application elle-même était déjà installée. Donc, à chaque fois que le fichier de bdd est modifié ailleurs que via l'application, il faut désinstaller celle-ci et lancer une nouvelle compilation. Aussi bête que ça!
    • Partager sur Facebook
    • Partager sur Twitter

    [Android] Base SQLite avec tables vides...

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown