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 :

[ListView] Adapater / NullPointerException


Sujet :

Composants graphiques Android

  1. #1
    Membre chevronné
    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
    Par défaut [ListView] Adapater / NullPointerException
    Bonjour ,

    J'aurais un souci concernant un : NullPointerException.

    Je m'explique , je programme une application qui quand elle démarre arrive sur un écran d'acceuil ou l'on choisi :

    - BUTTON 1 (vers : Begin.java): Importe une database(sqlite) , de ASSETS vers /data/data/package/databases/.(la tout va bien l'importation etc se fait bien)

    - BUTTON 2 (Vers : List.java): Affichage de champs de la database (nom et prenom)

    Et c'est dans le deuxième affichage List.java que j'aurais un souci.
    Quand c'est pour afficher une liste Statique aucun problème.
    Du style :
    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
    public class List extends Activity implements OnClickListener {
     
    	 public void onCreate(Bundle savedInstanceState) {
    	        super.onCreate(savedInstanceState);
    	        setContentView(R.layout.second);
     
    	        ListView lv1 ;
    	        final String lv_arr[]={"Android","iPhone","BlackBerry","AndroidPeople","Symbian", "Soleil"};
    	        lv1=(ListView)findViewById(R.id.list);
    	        lv1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , lv_arr));
     
     
    	        Button button = (Button)findViewById(R.id.button1);
    	        button.setOnClickListener(this); 
    }
     
    	@Override
    	public void onClick(View v) {
    		finish();
    	}
    }
    Mais quand j'essaye de faire apparaitre les champs "nom" et "prenom" ... j'ai des erreurs...
    Décryptage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Caused by : java.lang.NullPointerException
    at com.importdatabase.DataseHelper.getPersonnes(DatabaseHelper.java:136)
    at com.importdatabase.List.onCreate(List.java:19)

    Donc pour la ligne 136 : databaseHelper.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public ArrayList<String> getPersonnes() {
        ArrayList<String> output = new ArrayList<String>();
        String[] colonnesARecup = new String[] { "nom", "prenom" };
        Cursor cursorResults = mydb.query(TABLE_LISTELEC, colonnesARecup, null,
                null, null, null, "nom asc, prenom asc", null);
    	while (cursorResults.moveToFirst())
    	{
    		output.add(cursorResults.getString(0) + " " + cursorResults.getString(1));
    	}				
        return output;
    }
    pour la ligne 19 : List.java
    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
    public class List extends Activity implements OnClickListener {
    
    	 public void onCreate(Bundle savedInstanceState) {
    	        super.onCreate(savedInstanceState);
    	        setContentView(R.layout.second);
           
    	        DatabaseHelper dbh = new DatabaseHelper(this.getApplicationContext ());
    	        ListView lvListe = (ListView)findViewById(R.id.listView1	); 
    	        lvListe.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,dbh.getPersonnes()));
    	        
    	        Button button = (Button)findViewById(R.id.button1);
    	        button.setOnClickListener(this); 
    }
    
    	@Override
    	public void onClick(View v) {
    		finish();
    	}
    }
    Merci à vous ,

    Cordialement ,

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 101
    Par défaut
    Question bête mais sait-on jamais : As tu bien instancié mydb ? Vérifie en mettant un breakpoint à la ligne 136 et en lançant ton appli en mode debug.

  3. #3
    Membre chevronné
    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
    Par défaut
    Ok merci , j'ai mis un Toggle breakpoint et le programme s'arrête donc sur la ligne sans planter.
    Il me dis sinon quand je regarde un peu la valeur de mydb elle est "Null".

    Je pensais que sa pouvais venir de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Override
        public synchronized void close() {
            if(mydb != null)
                mydb.close();
            super.close();
        }
    et j'ai donc mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Override
        public synchronized void close() {
            if(mydb != null)
              //  mydb.close();
            super.close();
        }
    Mais cela plante pareil ...

    Du coup voila mes appels mydb :

    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
    //declaration 
        private SQLiteDatabase mydb; 
     
    //...........Code...................//
     
    public void openDatabase() throws SQLException {
    	//Open the database
        String myPath = DB_PATH + DB_NAME;
    	mydb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    }
    //...........Code...................//
     
    @Override
        public synchronized void close() {
            if(mydb != null)
                mydb.close();
            super.close();
        }
     
    public ArrayList<String> getPersonnes() {
        ArrayList<String> output = new ArrayList<String>();
        String[] colonnesARecup = new String[] { "nom", "prenom" };
        Cursor cursorResults = mydb.query(TABLE_LISTELEC, colonnesARecup, null,
                null, null, null, "nom asc, prenom asc", null);
    	while (cursorResults.moveToFirst())
    	{
    		output.add(cursorResults.getString(0) + " " + cursorResults.getString(1));
    	}				
        return output;
    }

  4. #4
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Août 2011
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2011
    Messages : 25
    Par défaut
    Salut,

    Si je comprends bien pour le deuxième bouton tu essais de mettre une interface graphique avec une listview dans laquelle apparait une partie de la base sqlite comportant le nom et le prénom ?

  5. #5
    Membre chevronné
    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
    Par défaut
    Oui c'est bien sa , j'ai un deuxieme xml avec une listView ou je voudrais faire afficher les "nom" et "prenom" dedans.

    Je suis obliger de le faire dans une vue différente puisque j'ai un bouton pour importer la base , et un bouton ensuite pour l'afficher.

    Une idée ? ^^

  6. #6
    Membre chevronné
    Homme Profil pro
    IUT Informatique
    Inscrit en
    Mars 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : IUT Informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 412
    Par défaut
    Salut,

    Une question, à quel endroit tu fais appel à ta fonction openDatabase() ? Je parle de la fonction que tu as écrit qui elle fera appel à SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);

  7. #7
    Membre chevronné
    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
    Par défaut
    J'instancie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DatabaseHelper dbh = new DatabaseHelper(this.getApplicationContext ());
    J'appelle la Classe DatabaseHelper que j'alias en dbh dans un nouveau context.

    Si tu as des idées de test à faire :S je tourne en rond la ...

  8. #8
    Membre chevronné
    Homme Profil pro
    IUT Informatique
    Inscrit en
    Mars 2011
    Messages
    412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : IUT Informatique

    Informations forums :
    Inscription : Mars 2011
    Messages : 412
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DatabaseHelper dbh = new DatabaseHelper(this.getApplicationContext ());
    La tu crée une instance de DatabaseHelper, mais en aucun cas (je pense du moins) ça instancie ta variable mydb.

    Tu pourrai faire un test déjà pour savoir si t'es bien passé dans la fonction openDatabase()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void openDatabase() throws SQLException {
    	//Open the database
    Log.i("test","on va instancier mydb");
        String myPath = DB_PATH + DB_NAME;
    	mydb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    Log.i("test","mydb="+mydb);
    }
    Vérifie dans ton LogCat après si t'as bien les traces.

    Après je sais pas si c'est une méthode implémentée openDatabase() mais si c'est toi qui l'a crée, tu devrai peut être la nomée différemment pour évité de t'embrouiller, et surtout essayer de respecter la syntaxe: openDataBase()

  9. #9
    Membre chevronné
    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
    Par défaut
    Ok , je viens d'essayer , je n'ai aucuns message dans mon LogCat concernant les messages de test ... :S ! Je recommencerais a Zéro demain matin je pense.

    Je comprend pas trop , quand je fait l'importation et que ensuite je met en commentaire les lignes d'importation de la base (une fois la base mise dans :/data/data/package/databases/) et que je met le code de listview sur le main.java , cela marche , mais quand je le met sur une autres activity et que je tente l'appel cela plante -_- ... frustrant :S !

    Merci quand même ! Nouvelle journée nouvelle aventure !

  10. #10
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Après je sais pas si c'est une méthode implémentée openDatabase() mais si c'est toi qui l'a crée, tu devrai peut être la nomée différemment pour évité de t'embrouiller, et surtout essayer de respecter la syntaxe: openDataBase()
    C'est une méthode crée .


    Elle est à appeler dans le constructeur du DatabaseHelper si la table n'est pas créer sinon il faut appeler la méthode createDatabase.

    les méthodes que l'on peut redéfinir de la classe SQLiteOpenHelper, si c'est bien cette classe que tu utlises :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    OnCreate() ;
    OnOpen();
    http://developer.android.com/referen...QLiteDatabase)

    Edit :

    un tuto un peu différent de la méthode que tu utilises donc je ne sais pas si cela pourra t'aider
    http://a-renouard.developpez.com/tut...ndroid/sqlite/

  11. #11
    Membre chevronné
    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
    Par défaut
    Pour l'appel il est bien fait dans mon DatabaseHelper (la source intégrale):
    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
    public class DatabaseHelper extends SQLiteOpenHelper{
     
        //The Android's default system path of your application database.
        private String DB_PATH;
     
        private static String DB_NAME = "npb.sqlite";
        private static final Integer DB_VERSION = 2;
     
        private static String TABLE_LISTELEC = "npb";
        private SQLiteDatabase mydb; 
     
        private final Context myContext;
     
        /**
         * Constructor
         * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
         * @param context
         */
        public DatabaseHelper(Context context) {
     
            super(context, DB_NAME, null, DB_VERSION);
            this.myContext = context;
            DB_PATH = "/data/data/com.importdatabase/databases/";
            //mydb = getReadableDatabase();
        }   
     
        @Override
        public void onCreate(SQLiteDatabase db) {
     
        }
     
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
     
     
     
    public void createDataBase() throws IOException{
        boolean dbExist = checkDataBase();
        if(dbExist){
                //do nothing - database already exist
        }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 {
                        copyDataBase();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
    }
     
    private void copyDataBase() throws IOException{
     
        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);
     
        // Path to the just created empty db
        String outFileName = DB_PATH + DB_NAME;
     
        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);
     
        //transfer bytes from the inputfile to the outputfile
     
     
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
     
        //Close the streams
        myOutput.close();
        myOutput.flush();   
        myInput.close();
    }
     
    public void openDatabase() throws SQLException {
    	//Open the database
    Log.i("test","on va instancier mydb");
       String myPath = DB_PATH + DB_NAME;
    	mydb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    Log.i("test","mydb="+mydb);
    }
     
     
    private boolean checkDataBase(){
     
        SQLiteDatabase checkDB = null;
     
        try{
                String myPath = DB_PATH + DB_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
     
        }catch(SQLiteException e){
     
                //database does't exist yet.
     
        }
     
        if(checkDB != null){
     
                checkDB.close();
     
        }
     
        return checkDB != null ? true : false;
    } 
     
    @Override
        public synchronized void close() {
            if(mydb != null)
                mydb.close();
            super.close();
        }
     
    public ArrayList<String> getPersonnes() {
        ArrayList<String> output = new ArrayList<String>();
        String[] colonnesARecup = new String[] { "nom", "prenom" };
        Cursor cursorResults = mydb.query(TABLE_LISTELEC, colonnesARecup, null,
                null, null, null, "nom asc, prenom asc", null);
    	while (cursorResults.moveToFirst())
    	{
    		output.add(cursorResults.getString(0) + " " + cursorResults.getString(1));
    	}				
        return output;
    }
     
    }
    Je ne comprend pas ce qui peu bien manquer ...

    Ps : Le tutoriel sur sqlite de tutomobile est assez l'un des moins bon que j'ai vue , il ne sert dans ... aucune situation -_- . (Ce n'est que mon point de vue)

    Edit : J'ai rajout une méthode onOpen() , après mon onCreate() :
    Mais cela n'as rien changer au problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Override
        public void onOpen(SQLiteDatabase db) {
            try {
                db.rawQuery("select * from npb", null);
            } catch ( SQLiteException e) {
                try {
                    copyDataBase();
                } catch (IOException e1) {
                }
            }
        }
    Et j'ai aussi tenté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DatabaseHelper dbh = new DatabaseHelper(this.getApplicationContext());
    	        dbh.onOpen(openOrCreateDatabase(null, 0, null));
    	        ListView lvListe = (ListView)findViewById(R.id.list); 
    	        lvListe.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,dbh.getPersonnes()));
    Tout cela sans succès ... Frustration quand tu me tiens!

  12. #12
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Essaye avec ça :
    Par contre, je pense que l'on peut améliorer le coup du check , puis open.

    Ensuite il te manque de code dans le OnCreate et le onUpgrade pour gérer ta table.

    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
    public class DatabaseHelper extends SQLiteOpenHelper{
     
        //The Android's default system path of your application database.
        private String DB_PATH;
     
        private static String DB_NAME = "npb.sqlite";
        private static final Integer DB_VERSION = 2;
     
        private static String TABLE_LISTELEC = "npb";
        private SQLiteDatabase mydb; 
     
        private final Context myContext;
     
        /**
         * Constructor
         * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
         * @param context
         */
        public DatabaseHelper(Context context) {
     
            super(context, DB_NAME, null, DB_VERSION);
            this.myContext = context;
            DB_PATH = "/data/data/com.importdatabase/databases/";
            //mydb = getReadableDatabase();
            
            createDataBase();
        }   
     
        @Override
        public void onCreate(SQLiteDatabase db) {
     
        }
     
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
              
        }
     
     
     
    public void createDataBase() throws IOException{
        boolean dbExist = checkDataBase();
        if(dbExist){
                //do nothing - database already exist
        }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 {
                        copyDataBase();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }
      openDatabase();
    
    }
     
    private void copyDataBase() throws IOException{
     
        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);
     
        // Path to the just created empty db
        String outFileName = DB_PATH + DB_NAME;
     
        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);
     
        //transfer bytes from the inputfile to the outputfile
     
     
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer)) > 0) {
            myOutput.write(buffer, 0, length);
        }
     
        //Close the streams
        myOutput.close();
        myOutput.flush();   
        myInput.close();
    }
     
    public void openDatabase() throws SQLException {
    	//Open the database
    Log.i("test","on va instancier mydb");
       String myPath = DB_PATH + DB_NAME;
    	mydb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
    Log.i("test","mydb="+mydb);
    }
     
     
    private boolean checkDataBase(){
     
        SQLiteDatabase checkDB = null;
     
        try{
                String myPath = DB_PATH + DB_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
     
        }catch(SQLiteException e){
     
                //database does't exist yet.
     
        }
     
        if(checkDB != null){
     
                checkDB.close();
     
        }
     
        return checkDB != null ? true : false;
    } 
     
    @Override
        public synchronized void close() {
            if(mydb != null)
                mydb.close();
            super.close();
        }
     
    public ArrayList<String> getPersonnes() {
        ArrayList<String> output = new ArrayList<String>();
        String[] colonnesARecup = new String[] { "nom", "prenom" };
        Cursor cursorResults = mydb.query(TABLE_LISTELEC, colonnesARecup, null,
                null, null, null, "nom asc, prenom asc", null);
    	while (cursorResults.moveToFirst())
    	{
    		output.add(cursorResults.getString(0) + " " + cursorResults.getString(1));
    	}				
        return output;
    }
     
    }
    Edit : Juste pour info , tu n'es pas obligé de lancé le createDataBase dans le constructeur tu peux le faire depuis l'extérieur de cette classe avant l'utilisation de la bd ^^, de même pour l'open.

    Du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DataBaseHelper myDbHelper = new DataBaseHelper();
            myDbHelper = new DataBaseHelper(this);
            try {
            	myDbHelper.createDataBase();
     	} catch (IOException e) {
     	}
     
     	try {
     		myDbHelper.openDataBase();
     	}catch(SQLException e){
     	}

  13. #13
    Membre chevronné
    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
    Par défaut
    Bonjour ,

    Merci je viens de faire les test ,

    Cela marche mais j'ai un problème de mémoire ^^ ! Quand je vais dans List.java (pour l'affichage dans une listview .. )
    Que j'ai modifier comme tu m'as indiquer tel que : (je t'en remercie)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	        DatabaseHelper dbh;
    			try {
    				dbh = new DatabaseHelper(this.getApplicationContext());
    				ListView lvListe = (ListView)findViewById(R.id.list); 
    		        lvListe.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,dbh.getPersonnes()));  
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    FATAL EXCEPTION: main
    java.lang.OutOfMemoryError
    at java.util.ArrayList.add(arrayList.java:123)
    at com.importdatabase.DatabaseHelper.getPersonnes(DatabaseHelper.java:151)
    at com.importdatabase.List.onCreate(List.java:23)
    Et j'ai un petit peu avant dans mon logCat :
    Clamp target GC heap from 24.366MB to 24.000MB
    GC_FOR_MALLOC freed 35295 object / 1187336 bytes in 499ms
    Forcing collection of SoftReferences for 1191496-bytes allocation
    Clamp target GC heap from 24.366MB to 24.000MB

    GC_FOR_MALLOC freed 0 object / 0 bytes in 633ms
    Out of memory on a 1191496-byte allocation
    Moi je comprend que une application Android ne peut dépasser plus de 24MB de ram, et que pour finir la gestion de ma requête il lui faudrait 24.366MB et du coup il essaye de "clamp" pour que sa passe mais cela saute ... !

    Merci,

    PS : si j'essaye de faire une recherche cela pourrait-il marcher ? plutôt que de tous les afficher, même si je pense que la recherche est aussi lourde en processus ...

  14. #14
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    PS : si j'essaye de faire une recherche cela pourrait-il marcher ? plutôt que de tous les afficher, même si je pense que la recherche est aussi lourde en processus ...
    Cela peut être une idée . Il faudrait réellement que tu réalises une analyse de tes besoins pour savoir quelle solution serait le plus appropriée .

    Après juste pour information sur certains téléphone tu n'auras que 16Mo de permis , donc fais bien attention !

  15. #15
    Membre chevronné
    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
    Par défaut
    Mon besoin est surtout faire de la recherche sur la base SQLite via un nom/prenom et ensuite pouvoir afficher les informations relatives à la personne.

    Juste que au passage je pensais qui serais intéressant de faire une liste de toutes les personnes.

    Je vais me mettre sur un formulaire de recherche !

    Intéressante information pour les 16MB de ram.
    Je suis sur Samsung Galaxy tab.Je ne connais pas la limite.(32MB étant l'émulateur limite, j'ai pas fait les test sur la Galaxy).

    Si tu connais d'autre limite (plus pour ma culture général que pour le projet!) pour les portable?tablette bas de gamme ? etc

    Cordialement ,

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 101
    Par défaut
    Tu n'aurais pas une fuite mémoire dans ton appli ? Cela parait quand même louche que tu arrives au max de la mémoire autorisé, a moins que tu n'aies une DB énorme...

  17. #17
    Membre chevronné
    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
    Par défaut
    Cela est fort probable , peux tu me dire comment voir les fuites mémoire ?

    Ma bdd (allégée) fait : 5collonnes X 37263ligne.

    Merci de ton point de vue,

  18. #18
    Expert confirmé

    Avatar de Feanorin
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    4 589
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 4 589
    Par défaut
    Bonjour,

    Tu peux toujours regarder !

    http://www.developpez.net/forums/d10...ation-tracker/

    Bon Courage

    Edit :
    Si tu connais d'autre limite (plus pour ma culture général que pour le projet!) pour les portable?tablette bas de gamme ? etc
    De mémoire comme cela, je ne sais pas , mais je vais m'y pencher , sujet intéressant

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 101
    Par défaut
    Tu essaie de remplir ton ArrayList avec tes 37263 lignes contenues dans la DB ? Si c'est le cas, effectivement ça peut atteindre la limite mémoire (tout dépend du contenu de tes objets). Moi je trouve ça un peu bourrin comme approche...

    As tu pensé à utiliser des techniques de lazy loading (charger en mémoire uniquement les données dont on a besoin) ?

  20. #20
    Membre chevronné
    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
    Par défaut
    Je ne connais pas ce principe de Lazy load ... :S !

    Oui c'est bien le cas que je veux ^^ ! La chose est que a Terme en rentrant juste 2 ou 3 champs a renseigner , on puisse atteindre l'enregistrement en question... !

    Je partais du principe tous les afficher et ensuite faire un champ d'autocomplexion pour reduit la liste de façon assez "visuel" mais au final je pense que ma logique de Access'dev n'est pas la bonne ^^ !

    Je vais voir pour le lazyLoading ... (si tu as des liens privilégiés ?)

    Le contenu de mes objects ? ce sont des TEXT.
    Moi je trouve ça un peu bourrin comme approche...
    Oui mais pour moi dans ma logique sa me semblais assez clair ^^ ! j’avançais step by step pour arrivé à un dénouement, mais au final c'est vrai que j'ai souvent des manière peu délicate pour les essais et les procédures.

    En tout cas merci de votre aide,

    @Feanorin : J'ai toujours des sujets intéressants !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. NullpointerException sur un adapteur de ListView
    Par Anduriel dans le forum Composants graphiques
    Réponses: 0
    Dernier message: 19/01/2014, 11h22
  2. ListView NullPointerException
    Par eento dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 05/08/2012, 17h32
  3. listview ??
    Par Galdarion dans le forum Composants VCL
    Réponses: 2
    Dernier message: 12/09/2002, 17h02
  4. ListView->Items->Clear() !!! Qques probl de perf
    Par Nicolas_a69 dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/08/2002, 11h49
  5. ListView
    Par SnickeursMan dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/08/2002, 10h42

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