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

Composants graphiques Android Discussion :

[SQLite] Afficher contenu dans une ListView


Sujet :

Composants graphiques Android

  1. #21
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    salut.

    il est effectivement possible de livre ton application avec la base de données pré-remplie.
    pour cela, tu places le fichier de la base dans le dossier assets de ton projet.
    dans le databasehelper, tu insères le code suivant :
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    	public void createDataBase() throws IOException
    	{
    		boolean dbExist = checkDataBase();
    		SQLiteDatabase db_Read = null;
     
    		if (!dbExist)
    		{
    			db_Read = this.getReadableDatabase(); 
    			db_Read.close();
     
    			copyDBFromResource();
     
    			File bddfile = myContext.getDatabasePath(DATABASE_NAME);
    			String database_file = bddfile.getPath();
     
    			SQLiteDatabase dbe = null;
     
    			try
    			{
    				dbe = SQLiteDatabase.openDatabase(database_file, null, SQLiteDatabase.OPEN_READWRITE);
    				dbe.setLocale(Locale.getDefault());
    				dbe.setLockingEnabled(true);
    				dbe.setVersion(1);
    				dbe.close();
    			}
    			catch(SQLiteException e)
    			{
    			}
    		}
    	}
    	//-----------------------------------------------------------------------------------	
     
    	private boolean checkDataBase()
    	{
    		SQLiteDatabase checkDB = null;
     
    		try
    		{
    			File bddfile = myContext.getDatabasePath(DATABASE_NAME);
    			String database_file = bddfile.getPath();
    			checkDB = SQLiteDatabase.openDatabase(database_file, null, SQLiteDatabase.OPEN_READONLY);
    		}
    		catch(SQLiteException e)
    		{
    			//database does't exist yet.
    		}
     
    		if (checkDB != null) checkDB.close();
     
    		return checkDB != null ? true : false;
    	}
    	//-----------------------------------------------------------------------------------	
     
    	public void openDataBase() throws SQLException
    	{
    		//open the database
    		File bddfile = myContext.getDatabasePath(DATABASE_NAME);
    		String database_file = bddfile.getPath();
    		db = SQLiteDatabase.openDatabase(database_file, null, SQLiteDatabase.OPEN_READWRITE);
    	}
    	//-----------------------------------------------------------------------------------	
     
    	@Override
    	public void onCreate(SQLiteDatabase db)
    	{
    	}
    	//-----------------------------------------------------------------------------------	
     
    	@Override
    	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    	{
    	}
    	//-----------------------------------------------------------------------------------	
     
    	private void copyDBFromResource()
    	{
    		File fileTest = myContext.getDatabasePath(DATABASE_NAME);
     
    		// Open the empty db as the output stream
    		try
    		{
    			InputStream databaseInputStream;
    			OutputStream databaseOutputStream;
    			byte[] buffer;
    			int length;
     
    			databaseInputStream = myContext.getAssets().open(DATABASE_NAME);
    			databaseOutputStream = new FileOutputStream(fileTest);
     
    			buffer = new byte[1024];
    			length = 0;
     
    			while ((length = databaseInputStream.read(buffer)) != -1)
    				databaseOutputStream.write(buffer, 0, length);
     
    			//close the streams
    			databaseInputStream.close();
    			databaseOutputStream.flush();
    			databaseOutputStream.close();
    		}
    		catch (FileNotFoundException e)
    		{
    			throw new Error("File not found.");
    		}
    		catch (IOException e)
    		{
    			throw new Error("Problem copying database from resource file.");
    		}
    	}
    Ensuite, dans la fonction onCreate ton activity principale, tu mets ceci :

    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
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
    		DatabaseHelper db = null;
     
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
     
    		//création de la base de données si nécessaire
    		try
    		{
    			db = new DatabaseHelper(this);
    			db.createDataBase();
    		}
    		catch(IOException ioe)
    		{
    			if (db != null)
    			throw new Error("Unable to create database");
    		}
    	}
    Dès que l'appli est exécutée, elle vérifie que la bdd existe à l'emplacement par défaut.
    Si elle existe, on ne fait rien.
    Par contre, si elle n'existe pas, on la crée en recopiant la ressource stockée dans assets.

    Mon code aura peut-être besoin d'une adaptation pour ton usage.
    Ceci étant dit, cela fonctionne très bien sur mon appli.

    Petit conseil supplémentaire : si à l'aide d'un utilitaire quelconque autre que les outils fournis par Eclipse, tu modifies le contenu du fichier de base de données contenu dans le dossier assets, il est apparemment utile de rafraichir le fichier dans l'arborescence du projet dans Eclipse (clic droit/refresh).

    Bon courage !

  2. #22
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    Merci à toi ,

    Cela marche pas totalement pour moi ...

    Il me créais bien le Folder "/databases/" et me met dedans ma base de donnée...

    Mais il s'arrête a 3072bytes , hors ma base fais 1671168 bytes.
    Je pense qu'il créais juste la base en temps que elle même sans en créer les tables (j'ai ouvert le sqlite et il n'y as aucune table dedans .. :S )

    Si tu as une solution ?


    HUMMM EDIT : 11h42 ... Suprenant sa ne marche même plus o_o ! Enfin il me créais bien la bd de 3072 mais le programme plan , aucune erreur dans le DDMS ...


    Mes sources intégrales ci-suis. (j'ai bien le ELECT.sqlite dans le Assets)

    Mon DatabaseHelper :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    package com.importdatabase;
     
     
    	import java.io.File;
    	import java.io.FileNotFoundException;
    	import java.io.FileOutputStream;
    	import java.io.IOException;
    	import java.io.InputStream;
    	import java.io.OutputStream;
    	import java.util.Locale;
     
    	import android.content.Context;
    	import android.database.SQLException;
    	import android.database.sqlite.SQLiteDatabase;
    	import android.database.sqlite.SQLiteException;
    	import android.database.sqlite.SQLiteOpenHelper;
     
    	public class DatabaseHelper extends SQLiteOpenHelper{
     
     
     
     
    	    public DatabaseHelper(Context context) {
    	        super(context, DB_NAME, null, DATABASE_VERSION);
    	        //db = getWritableDatabase();
    	        db = getReadableDatabase();
    	    }
     
    		//nom de la base
    	    private static String DB_NAME = "ELECT.sqlite";
    	    // le context
    	    private final Context myContext = null;
    	    private static final int DATABASE_VERSION = 4;
    	    private SQLiteDatabase db;
    	    //private static String TABLE_LISTELEC = "LISTELEC1";
     
    	    /**
                 * Constructeur
                 *
                 * @param context
                 */
    		public void createDataBase() throws IOException
    		{
    			boolean dbExist = checkDataBase();
    			SQLiteDatabase db_Read = null;
     
    			if (!dbExist)
    			{
    				db_Read = this.getReadableDatabase(); 
    				db_Read.close();
     
    				copyDBFromResource();
     
    				File bddfile = myContext.getDatabasePath(DB_NAME);
    				String database_file = bddfile.getPath();
     
    				SQLiteDatabase dbe = null;
     
    				try
    				{
    					dbe = SQLiteDatabase.openDatabase(database_file, null, SQLiteDatabase.OPEN_READWRITE);
    					dbe.setLocale(Locale.getDefault());
    					dbe.setLockingEnabled(true);
    					dbe.setVersion(1);
    					dbe.close();
    				}
    				catch(SQLiteException e)
    				{
    				}
    			}
    		}
    		//-----------------------------------------------------------------------------------	
     
    		private boolean checkDataBase()
    		{
    			SQLiteDatabase checkDB = null;
     
    			try
    			{
    				File bddfile = myContext.getDatabasePath(DB_NAME);
    				String database_file = bddfile.getPath();
    				checkDB = SQLiteDatabase.openDatabase(database_file, null, SQLiteDatabase.OPEN_READONLY);
    			}
    			catch(SQLiteException e)
    			{
    				//database does't exist yet.
    			}
     
    			if (checkDB != null) checkDB.close();
     
    			return checkDB != null ? true : false;
    		}
    		//-----------------------------------------------------------------------------------	
     
    		public void openDataBase() throws SQLException
    		{
    			//open the database
    			File bddfile = myContext.getDatabasePath(DB_NAME);
    			String database_file = bddfile.getPath();
    			db = SQLiteDatabase.openDatabase(database_file, null, SQLiteDatabase.OPEN_READWRITE);
    		}
    		//-----------------------------------------------------------------------------------	
     
    		@Override
    		public void onCreate(SQLiteDatabase db)
    		{
    		}
    		//-----------------------------------------------------------------------------------	
     
    		@Override
    		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
    		{
    		}
    		//-----------------------------------------------------------------------------------	
     
    		private void copyDBFromResource()
    		{
    			File fileTest = myContext.getDatabasePath(DB_NAME);
     
    			// Open the empty db as the output stream
    			try
    			{
    				InputStream databaseInputStream;
    				OutputStream databaseOutputStream;
    				byte[] buffer;
    				int length;
     
    				databaseInputStream = myContext.getAssets().open(DB_NAME);
    				databaseOutputStream = new FileOutputStream(fileTest);
     
    				buffer = new byte[1024];
    				length = 0;
     
    				while ((length = databaseInputStream.read(buffer)) != -1)
    					databaseOutputStream.write(buffer, 0, length);
     
    				//close the streams
    				databaseInputStream.close();
    				databaseOutputStream.flush();
    				databaseOutputStream.close();
    			}
    			catch (FileNotFoundException e)
    			{
    				throw new Error("File not found.");
    			}
    			catch (IOException e)
    			{
    				throw new Error("Problem copying database from resource file.");
    			}
    		} }
    Mon Main :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    package com.importdatabase;
     
    import java.io.IOException;
     
    import android.app.Activity;
    import android.os.Bundle;
     
    public class ImportdatabaseActivity extends Activity {
        /** Called when the activity is first created. */
    	@Override
        public void onCreate(Bundle savedInstanceState)
        {
    		DatabaseHelper db = null;
     
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
     
    		//création de la base de données si nécessaire
    		try
    		{
    			db = new DatabaseHelper(this);
    			db.createDataBase();
    		}
    		catch(IOException ioe)
    		{
    			if (db != null)
    			throw new Error("Unable to create database");
    		}
    	}
        }

  3. #23
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    En fait, il ne crée pas la base.
    C'est une procédure pour faire une copie brute du fichier contenu dans le dossier assets.
    La copie est effectuée par morceaux de 1024 octets.
    Cette procédure permet de démarrer pour la première fois l'application avec des données pré-remplies.
    Si tu souhaites ne créer que la structure de la base de données avec des tables vides, il faut utiliser des clauses SQL, ou alors tu mets dans le dossier assets une base vide.

  4. #24
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 385
    Points : 492
    Points
    492
    Par défaut
    D'accord donc mon souci est bien qu'il ne fait pas la copie intégral ^^ !
    Mais il s'arrête a 3072bytes , hors ma base fais 1671168 bytes.
    il manque un gros bout (tout le contenu a ce que j'ai vue en l'exportant ^^)

  5. #25
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Avril 2004
    Messages : 249
    Points : 112
    Points
    112
    Par défaut
    Désolé mais je suis "jeune" programmeur sous Android et mes compétences sont limitées.
    Je ne pense pas pouvoir t'aider plus.
    J'avais trouvé ces bouts de code sur des forums traitant de l'installation d'une base pré-remplie. Il y était question, pour certains, de problèmes au moment de la recopie, un peu comme toi.
    C'est d'ailleurs pour cela que la copie est faite morceau par morceau.
    Peut être faut-il jouer sur la taille du tableau de byte pour régler ton problème.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Contenu d'une base SQLite dans une ListView
    Par NeiloSS dans le forum Composants graphiques
    Réponses: 9
    Dernier message: 25/06/2016, 03h11
  2. [Débutant] Afficher le contenu d'une listview dans des textbox
    Par Martipit dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/04/2013, 16h01
  3. Affichage du contenu d'une BDD SQLite dans une ListView
    Par mike3012 dans le forum Composants graphiques
    Réponses: 17
    Dernier message: 26/08/2012, 04h34
  4. affiché "hello" dans une listView!
    Par Bindy dans le forum Windows Presentation Foundation
    Réponses: 1
    Dernier message: 06/05/2010, 15h23
  5. Réponses: 0
    Dernier message: 24/07/2007, 14h22

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