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 :

Problème avec base de données


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 36
    Par défaut Problème avec base de données
    Bonjour,

    Je dois réaliser une application permettant d'enregistrer des notes en base de données. A l'insertion dans une table, je dois enregistrer uniquement le titre. Le contenu doit être inséré par un update.
    J'ai déjà pas mal avancé, mais après plusieurs recherche, je n'arrive pas à enregistrer en base de données, le code bloque à la création de la table. Pourtant, il me semble que la syntaxe est correcte.

    Test de l'application :

    Voici l'Activity principale, section de création de la boite de dialogue personnalisée avec bouton de validation
    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
    ...
    builder/*.setMessage(R.string.dialog_message)
                        */.setTitle(R.string.dialog_title)
                        .setView(inflater.inflate(R.layout.layout_dialog_add, null));
                final EditText titreEditable = (EditText)DialogView.findViewById(R.id.titleNote);
     
                // Add the buttons
                builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        // User clicked OK button
                        String titre;
                        titre = titreEditable.getText().toString();
                        notes note = datasource.createNote(titre);
                        adapter.add(note);
                        adapter.notifyDataSetChanged();
     
                        dialog.dismiss();
                        Context context = getApplicationContext();
                        CharSequence text = "Note sauvegardée";
                        int duration = LENGTH_SHORT;
     
                        Toast toast = makeText(context, text, duration);
                        toast.show();
                    }
                });
    ...
    DataSource de la base de données :
    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
    package fr.iut_amiens.nicolas.td3;
     
    import java.util.ArrayList;
    import java.util.List;
     
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
     
    /**
     * Created by Nicolas on 06/02/2015.
     */
    public class notesDataSource {
        // Database fields
        private SQLiteDatabase database;
        private DatabaseOpenHelper dbHelper;
        private String[] allColumns = { DatabaseOpenHelper.COLUMN_ID,
                DatabaseOpenHelper.COLUMN_TITLE };
     
        public notesDataSource(Context context) {
            dbHelper = new DatabaseOpenHelper(context);
        }
     
        public void open() throws SQLException {
            database = dbHelper.getWritableDatabase();
        }
     
        public void read() throws SQLException {
            database = dbHelper.getReadableDatabase();
        }
     
        public void close() {
            dbHelper.close();
        }
     
        public void deleteTable() { dbHelper.deleteTable(database);}
     
        public notes createNote(String titre) {
            ContentValues values = new ContentValues();
            notes note = new notes(titre);
            values.put(DatabaseOpenHelper.COLUMN_TITLE, note.getTitle());
            values.put(DatabaseOpenHelper.COLUMN_CONTENT, note.getContent());
            long insertId = database.insert(DatabaseOpenHelper.DATABASE_TABLE_NOTES, null,
                    values);
            Cursor cursor = database.query(DatabaseOpenHelper.DATABASE_TABLE_NOTES,
                    allColumns, DatabaseOpenHelper.COLUMN_ID + " = " + insertId, null,
                    null, null, null);
            cursor.moveToFirst();
            notes newNote = cursorToNote(cursor);
            cursor.close();
            return newNote;
        }
     
        public void deleteNote(notes note) {
            long id = note.getId();
            System.out.println("Note deleted with id: " + id);
            database.delete(DatabaseOpenHelper.DATABASE_TABLE_NOTES, DatabaseOpenHelper.COLUMN_ID
                    + " = " + id, null);
        }
     
        public List<notes> getAllNotes() {
            List<notes> listNotes = new ArrayList<notes>();
     
            Cursor cursor = database.query(DatabaseOpenHelper.DATABASE_TABLE_NOTES,
                    new String[] {"_id", "title", "content"}, null, null, null, null, null);
     
     
     
            cursor.moveToFirst();
            while (!cursor.isAfterLast()) {
                notes notes = cursorToNote(cursor);
                listNotes.add(notes);
                cursor.moveToNext();
            }
            // make sure to close the cursor
            cursor.close();
            return listNotes;
        }
     
        private notes cursorToNote(Cursor cursor) {
            notes notes = new notes();
            notes.setId(cursor.getLong(0));
            notes.setTitle(cursor.getString(1));
            notes.setContent(cursor.getString(2));
            return notes;
        }
    }
    OpenHelper
    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
    package fr.iut_amiens.nicolas.td3;
     
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
     
    /**
     * Created by Nicolas on 06/02/2015.
     */
    public class DatabaseOpenHelper extends SQLiteOpenHelper {
     
        private static final int DATABASE_VERSION = 2;
        public static final String DATABASE_TABLE_NOTES= "Notes";
        public static final String COLUMN_ID = "_id";
        public static final String COLUMN_TITLE= "title";
        public static final String COLUMN_CONTENT= "content";
        public static final String DATABASE_NAME= "db.note";
        private static final String DATABASE_TABLE_CREATE =
                "CREATE TABLE " + DATABASE_TABLE_NOTES + " (" +
                        COLUMN_ID + " integer primary key autoincrement, " +
                        COLUMN_TITLE + " TEXT NOT NULL, " +
                        COLUMN_CONTENT+ " TEXT ) ; ";
     
        public DatabaseOpenHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
     
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(DATABASE_TABLE_CREATE);
        }
     
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(DatabaseOpenHelper.class.getName(),
                    "Upgrading database from version " + oldVersion + " to "
                            + newVersion + ", which will destroy all old data");
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_NOTES);
            onCreate(db);
        }
     
        public void deleteTable(SQLiteDatabase db){
            db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE_NOTES);
        }
    }
    Logcat :
    02-14 16:37:36.460 5177-5177/fr.iut_amiens.nicolas.td3 I/art﹕ Late-enabling -Xcheck:jni
    02-14 16:37:37.254 5177-5218/fr.iut_amiens.nicolas.td3 D/OpenGLRenderer﹕ Render dirty regions requested: true
    02-14 16:37:37.302 5177-5177/fr.iut_amiens.nicolas.td3 D/Atlas﹕ Validating map...
    02-14 16:37:37.382 5177-5218/fr.iut_amiens.nicolas.td3 I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: QUALCOMM Build: 10/28/14, c33033c, Ia6306ec328
    02-14 16:37:37.385 5177-5218/fr.iut_amiens.nicolas.td3 I/OpenGLRenderer﹕ Initialized EGL, version 1.4
    02-14 16:37:37.461 5177-5218/fr.iut_amiens.nicolas.td3 D/OpenGLRenderer﹕ Enabling debug mode 0
    02-14 16:37:39.434 5177-5177/fr.iut_amiens.nicolas.td3 W/InputEventReceiver﹕ Attempted to finish an input event but the input event receiver has already been disposed.
    02-14 16:37:39.436 5177-5177/fr.iut_amiens.nicolas.td3 W/ViewRootImpl﹕ Dropping event due to root view being removed: MotionEvent { action=ACTION_UP, id[0]=0, x[0]=988.03564, y[0]=-541.4286, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=192350469, downTime=192350425, deviceId=6, source=0x1002 }
    02-14 16:37:39.436 5177-5177/fr.iut_amiens.nicolas.td3 W/InputEventReceiver﹕ Attempted to finish an input event but the input event receiver has already been disposed.
    02-14 16:37:39.436 5177-5177/fr.iut_amiens.nicolas.td3 W/IInputConnectionWrapper﹕ getSelectedText on inactive InputConnection
    02-14 16:37:39.448 5177-5177/fr.iut_amiens.nicolas.td3 W/IInputConnectionWrapper﹕ requestCursorAnchorInfo on inactive InputConnection
    02-14 16:37:39.452 5177-5177/fr.iut_amiens.nicolas.td3 W/IInputConnectionWrapper﹕ getTextBeforeCursor on inactive InputConnection
    02-14 16:37:39.619 5177-5177/fr.iut_amiens.nicolas.td3 W/IInputConnectionWrapper﹕ getTextBeforeCursor on inactive InputConnection
    02-14 16:37:43.203 5177-5177/fr.iut_amiens.nicolas.td3 E/SQLiteLog﹕ (1) no such table: Notes
    02-14 16:37:43.227 5177-5177/fr.iut_amiens.nicolas.td3 E/SQLiteDatabase﹕ Error inserting title= content=null
    android.database.sqlite.SQLiteException: no such table: Notes (code 1): , while compiling: INSERT INTO Notes(title,content) VALUES (?,?)
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
    at fr.iut_amiens.nicolas.td3.notesDataSource.createNote(notesDataSource.java:46)
    at fr.iut_amiens.nicolas.td3.MainActivity$2.onClick(MainActivity.java:130)
    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:160)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5221)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
    02-14 16:37:43.227 5177-5177/fr.iut_amiens.nicolas.td3 E/SQLiteLog﹕ (1) no such table: Notes
    02-14 16:37:43.228 5177-5177/fr.iut_amiens.nicolas.td3 D/AndroidRuntime﹕ Shutting down VM
    02-14 16:37:43.231 5177-5177/fr.iut_amiens.nicolas.td3 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: fr.iut_amiens.nicolas.td3, PID: 5177
    android.database.sqlite.SQLiteException: no such table: Notes (code 1): , while compiling: SELECT _id, title FROM Notes WHERE _id = -1
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
    at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034)
    at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202)
    at fr.iut_amiens.nicolas.td3.notesDataSource.createNote(notesDataSource.java:48)
    at fr.iut_amiens.nicolas.td3.MainActivity$2.onClick(MainActivity.java:130)
    at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:160)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5221)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
    02-14 16:37:55.197 5177-5177/fr.iut_amiens.nicolas.td3 I/Process﹕ Sending signal. PID: 5177 SIG: 9
    Quelqu'un saurait-il m'indiquer comment résoudre ce problème ?

    Merci d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    L'erreur est "no such table: Notes" : elle existe bien cette table "Notes" dans ta base ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre averti
    Homme Profil pro
    Etudiant
    Inscrit en
    Novembre 2014
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Etudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 36
    Par défaut
    En fait, normalement, la table se crée à la création d'un objet dbhelpher, à ce que j'en ai pensé quand j'ai écrit le code, ça devrait être bon

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Manifestement non, d'après le message dans le logcat. Je ne connais pas la programmation Android, si SQLite, mais onCreate() de DatabaseOpenHelper est censée s'exécuter lors de l'appel de getWritableDatabase(), si la database n'existe pas, je suppose. Tu pourrais le vérifier avec une simple trace. Sinon, je ne peux que te renvoyer vers le tutoriel Developpez.

    Par ailleurs, le problème pourrait être lié au drop table que tu fais dans deleteTable() : elle est appelée quand cette méthode ? Peut-être faudrait-il ajouter un drop database aussi ? Je suppose que le onCreate ne sera pas appelé si la base existe déjà et la table non, donc le create table ne pourra être fait dans ce cas.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

Discussions similaires

  1. Problème avec base de données oracle
    Par jonnyboy dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 16/02/2010, 12h10
  2. Réponses: 1
    Dernier message: 19/02/2008, 23h05
  3. Plusieurs problèmes avec base de données
    Par mithrendil dans le forum Servlets/JSP
    Réponses: 10
    Dernier message: 17/01/2008, 16h23
  4. svp problème avec base de données
    Par midosone dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 26/03/2007, 10h45
  5. [MySQL] Problème avec base de données
    Par ThAOTh dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/08/2006, 13h42

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