2012-07-03 3 views
1

J'ai essayé depuis presque une semaine maintenant de créer une base de données SQLite avec plus d'une table, mais sans succès. J'ai cherché des heures et regardé tous les sujets sur le sujet ici, et je n'ai aucune idée de ce que je fais mal.Plusieurs tables SQLite

Voici un code que j'ai obtenu sur Internet pour une table, et j'en ai ajouté un autre, et ça ne marche plus.

Adaptateur:

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 

public class WorkingAdapter { 

    public static final String WORKINGDATABASE_NAME = "WORKING_DATABASE"; 
    public static final String WORKINGDATABASE_TABLE = "WORKING_TABLE"; 
    public static final int MYDATABASE_VERSION = 1; 
    public static final String KEY_ID = "_id"; 
    public static final String KEY_CONTENT = "Content"; 

    //create table MY_DATABASE (ID integer primary key, Content text not null); 
    private static final String SCRIPT_CREATE_WORKING_DATABASE = 
     "create table " + WORKINGDATABASE_TABLE + " (" 
     + KEY_ID + " integer primary key autoincrement, " 
     + KEY_CONTENT + " text not null);"; 

    public static final String WORKINGDATABASE_TABLE2 = "MY_TABLE2"; 
    public static final String KEY_ID2 = "_id2"; 
    public static final String KEY_CONTENT2 = "Content2"; 

    //create table MY_DATABASE (ID integer primary key, Content text not null); 
    private static final String SCRIPT_CREATE_WORKING_DATABASE2 = 
     "create table " + WORKINGDATABASE_TABLE2 + " (" 
     + KEY_ID2 + " integer primary key autoincrement, " 
     + KEY_CONTENT2 + " text not null);"; 

    private SQLiteHelper sqLiteHelper; 
    private SQLiteDatabase sqLiteDatabase; 

    private Context context; 

    public WorkingAdapter(Context c){ 
     context = c; 
    } 

    public WorkingAdapter openToRead() throws android.database.SQLException { 
     sqLiteHelper = new SQLiteHelper(context, WORKINGDATABASE_NAME, null, MYDATABASE_VERSION); 
     sqLiteDatabase = sqLiteHelper.getReadableDatabase(); 
     return this;  
    } 

    public WorkingAdapter openToWrite() throws android.database.SQLException { 
     sqLiteHelper = new SQLiteHelper(context, WORKINGDATABASE_NAME, null, MYDATABASE_VERSION); 
     sqLiteDatabase = sqLiteHelper.getWritableDatabase(); 
     return this;  
    } 

    public void close(){ 
     sqLiteHelper.close(); 
    } 

    public long insert(String content){ 

     ContentValues contentValues = new ContentValues(); 
     contentValues.put(KEY_CONTENT, content); 
     return sqLiteDatabase.insert(WORKINGDATABASE_TABLE, null, contentValues); 
    } 

public long insert2(String content){ 

     ContentValues contentValues = new ContentValues(); 
     contentValues.put(KEY_CONTENT2, content); 
     return sqLiteDatabase.insert(WORKINGDATABASE_TABLE2, null, contentValues); 
    } 

    public int deleteAll(){ 
     return sqLiteDatabase.delete(WORKINGDATABASE_TABLE, null, null); 
    } 

    public Cursor queueAll(){ 
     String[] columns = new String[]{KEY_ID, KEY_CONTENT}; 
     Cursor cursor = sqLiteDatabase.query(WORKINGDATABASE_TABLE, columns, 
       null, null, null, null, null); 

     return cursor; 
    } 

    public Cursor queueAll2(){ 
     String[] columns = new String[]{KEY_ID2, KEY_CONTENT2}; 
     Cursor cursor = sqLiteDatabase.query(WORKINGDATABASE_TABLE2, columns, 
       null, null, null, null, null); 

     return cursor; 
    } 

    public class SQLiteHelper extends SQLiteOpenHelper { 

     public SQLiteHelper(Context context, String name, 
       CursorFactory factory, int version) { 
      super(context, name, factory, version); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      // TODO Auto-generated method stub 
      db.execSQL(SCRIPT_CREATE_WORKING_DATABASE); 
      db.execSQL(SCRIPT_CREATE_WORKING_DATABASE2); 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // TODO Auto-generated method stub 
      db.execSQL("DROP TABLE IF EXISTS " + WORKINGDATABASE_TABLE); 
      db.execSQL("DROP TABLE IF EXISTS " + WORKINGDATABASE_TABLE2); 
      onCreate(db); 
     } 

    } 

} 

Activité:

import android.app.Activity; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.widget.ListView; 
import android.widget.SimpleCursorAdapter; 

public class AndroidSQLite extends Activity { 

    private WorkingAdapter myWorkingAdapter; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     ListView listContent = (ListView)findViewById(R.id.contentlist); 

     /* 
     * Create/Open a SQLite database 
     * and fill with dummy content 
     * and close it 
     */ 
     myWorkingAdapter = new WorkingAdapter(this); 
     myWorkingAdapter.openToWrite(); 
     myWorkingAdapter.deleteAll(); 

     myWorkingAdapter.insert("A for Apply"); 
     myWorkingAdapter.insert("B for Boy"); 
     myWorkingAdapter.insert("C for Cat"); 
     myWorkingAdapter.insert("D for Dog"); 
     myWorkingAdapter.insert("E for Egg"); 
     myWorkingAdapter.insert("F for Fish"); 
     myWorkingAdapter.insert("G for Girl"); 
     myWorkingAdapter.insert("H for Hand"); 
     myWorkingAdapter.insert("I for Ice-scream"); 
     myWorkingAdapter.insert("J for Jet"); 
     myWorkingAdapter.insert("K for Kite"); 
     myWorkingAdapter.insert("L for Lamp"); 
     myWorkingAdapter.insert("M for Man"); 
     myWorkingAdapter.insert("N for Nose"); 
     myWorkingAdapter.insert("O for Orange"); 
     myWorkingAdapter.insert("P for Pen"); 
     myWorkingAdapter.insert("Q for Queen"); 
     myWorkingAdapter.insert("R for Rain"); 
     myWorkingAdapter.insert("S for Sugar"); 
     myWorkingAdapter.insert("T for Tree"); 
     myWorkingAdapter.insert("U for Umbrella"); 
     myWorkingAdapter.insert("V for Van"); 
     myWorkingAdapter.insert("W for Water"); 
     myWorkingAdapter.insert("X for X'mas"); 
     myWorkingAdapter.insert("Y for Yellow"); 
     myWorkingAdapter.insert("Z for Zoo"); 

     myWorkingAdapter.insert2("W FOR WORKING"); 

     myWorkingAdapter.close(); 

     /* 
     * Open the same SQLite database 
     * and read all it's content. 
     */ 
     myWorkingAdapter = new WorkingAdapter(this); 
     myWorkingAdapter.openToRead(); 

     Cursor cursor = myWorkingAdapter.queueAll2(); 
     startManagingCursor(cursor); 

     String[] from = new String[]{WorkingAdapter.KEY_CONTENT}; 
     int[] to = new int[]{R.id.text}; 

     SimpleCursorAdapter cursorAdapter = 
      new SimpleCursorAdapter(this, R.layout.row, cursor, from, to); 

     listContent.setAdapter(cursorAdapter); 

     myWorkingAdapter.close(); 


    } 
} 

je sans cesse cherché exaples pour les bases de données SQLite avec plus d'une table, et non d'entre eux travaillaient, et a fait exactement ce que je lis dans toutes les pages que j'ai trouvées sur le sujet, pouvez-vous s'il vous plaît me dire ce que je fais mal?

Merci :)

+0

Le simple fait d'indiquer que "ça ne marche pas" n'est pas suffisant. Vous devez nous dire ce qui vous cause spécifiquement des problèmes. Publiez * toutes * les informations de logcat si une exception est levée. –

Répondre

0

choses à essayer:

  1. SimpleCursorAdapter nécessite une colonne nommée _id dans son Cursor. Si le Cursor ne contient pas une colonne nommée _id, une exception sera levée.

    Modifiez _id2 pour revenir à _id pour résoudre ce problème.

  2. Aller à Paramètres ->Apps ->[votre application] -> Effacer les données chaque fois que vous exécutez votre application (mise à jour). Ceci est important car vous voulez être sûr à 100% que vous travaillez avec une table rase chaque fois que vous exécutez votre application.

  3. Utilisez un ListActivity au lieu d'un Activity. Cela rend votre vie plus facile (ne pas avoir à traiter avec le ListView directement) et peut diminuer la probabilité d'erreur. Assurez-vous d'appeler le setListAdapter(adapter) au onCreate. Ne pas utiliser startManagingCursor ... il est obsolète comme Android 3.0. Vous devez utiliser le CursorLoader s et le LoaderManager introduit dans Android 3.0 (et pris en charge par Android 1.6 dans le package de compatibilité).

  4. Ne créez pas plusieurs instances WorkingAdapter (ou autre). Cela ne fait que rendre votre code plus compliqué et il est plus probable que vous fuyiez votre SQLiteDatabase en oubliant de le fermer. Vous pouvez en savoir plus sur ce ici:

    How to make my SQLiteDatabase a Singleton?

+0

Merci un lo pour tous les conseils ! Donc, pour être clair, est de faire un très gros adaptateur avec toutes mes différentes tables et fonctions de retour de la meilleure façon? – user1476876

+0

Je pense que le mot "adaptateur" ici est un peu trompeur. Votre "workeradapter" n'est pas vraiment un adaptateur .. C'est un "wrapper" autour de votre SQLiteDatabase que vous utilisez pour faire abstraction de certains des détails les plus fastidieux de votre code d'activité.Un "adaptateur" est quelque chose qui lie les données d'une source à l'autre ... par exemple, 'SimpleCursorAdapter 'qui lie chaque ligne du' Cursor' à un seul élément 'ListView' Pour répondre à votre question cependant ... c'est * généralement * une bonne idée de faire ce que vous faites ici: c'est-à-dire d'envelopper tout la substance liée à la base de données dans une classe d'aide unique. –

+0

Je voudrais changer le nom 'WorkerAdapter' en' MyDatabaseHelper' ou quelque chose comme ça. –

0

_id est une colonne spéciale dans une table SQLLite. C'est la clé primaire de chaque table et si je me souviens bien, elle sera créée automatiquement si vous ne la définissez pas. Je soupçonne que vous le changeant en _id2 causant d'une manière ou d'une autre un problème. Donc, le changer en arrière:

public static final String KEY_ID2 = "_id"; 

Et essayez comme ça.

Notez également que (comme c'est le cas maintenant) votre application va essayer de créer les tables chaque fois qu'elle s'exécute. Donc, s'il crée la première table à la première exécution mais ne parvient pas à créer la deuxième table et que vous corrigez l'erreur et relancez votre application, cette fois, elle échouera lors de la création de la première table car elle est déjà créée. Donc, pour éviter ces problèmes assurez-vous de faire une installation propre & gérer correctement le versionnement de la base de données.

+0

Déjà essayé, ne fonctionne pas :( – user1476876

+0

'SQLite' ne nécessite pas une colonne nommée' _id' ... la classe 'CursorAdapter' fait –

+0

Quelle erreur obtenez-vous? – Caner

1

changement

public static final int MYDATABASE_VERSION = 1; 

à

public static final int MYDATABASE_VERSION = 2; 

et chaque fois que vous changez votre changement de base de données incrémenter déclenchera onUpgrade décrémentant wi ll déclencher onDowngrade (si vous avez besoin de le faire et bien sûr vous le remplacez)

vous pouvez en savoir plus sur le constructeur de android developer resources

+0

Déjà incrémenté la version. – user1476876

0

Qu'est-ce Caner dit, vous pouvez aussi ne pas besoin KEY_CONTENT2 comme « Content2 », Le nom de la colonne est unique au sein d'une table, donc le nom Content est suffisant.

Également, avez-vous essayé d'effacer la base de données d'applications? Aller à Paramètres-> Applications-> Votre application-> Effacer les données. Votre base de données a peut-être été créée à la version 1 avec l'ancienne version, mais vous n'avez pas spécifié la version 2, donc la méthode onUpgrade() ne sera pas appelée. Donc soit effacer la base de données de l'application, ou cogner la version db à 2.

+0

Oui, j'ai essayé, mais la chose bizarre est que lorsque j'essaie d'exécuter l'application avec KEY_CONTENT2 = "Content2", cela ne fonctionne pas, mais quand je le change en contenu, il le fait. Une idée? Et encore une chose, dois-je faire quelque chose de différent si je veux plus de 2 colonnes? C'EST À DIRE. _id, nom, lieu de travail, heure, date. – user1476876