Android. SQLite Exception: aucune colonne de ce type _id
Je vais avoir des problèmes en essayant d'obtenir les informations sont stockées dans ma base de données et de le présenter dans une ListView.
C'est le ListActivity où je veux afficher les lignes:
public class Prueba extends ListActivity{
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.i_prueba);
DataBaseAccess db = new DataBaseAccess(this);
db.open();
Cursor result = db.getAllContact();
startManagingCursor(result);
// the desired columns to be bound
String[] columns = new String[] {"_id", "nombre", "telefono", "mail"};
// the XML defined views which the data will be bound to
int[] to = new int[] { R.id.textid, R.id.textNombre, R.id.textTelefono, R.id.textMail };
SimpleCursorAdapter mAdapter = new SimpleCursorAdapter(this, R.layout.i_listadb, result, columns, to);
this.setListAdapter(mAdapter);
}
La classe DB. Voici la méthode getAllContact où j'obtiens l'erreur:
public class DataBaseAccess {
public static final String NOMBRE = "nombre";
public static final String TELEFONO = "telefono";
public static final String MAIL = "mail";
public static final String ID = "_id";
public DataBaseAccess(Context context) {
this.androidContext = context;
//DataBaseHelper is another class where the Database is created. In the "onCreate" //method of that class is where i make the CREATE TABLE and add some values to that //table.
dbHelper = new DataBaseHelper(androidContext);
}
public void open() throws SQLException {
db = dbHelper.getWritableDatabase();
}
[...MORE METHODS...]
public Cursor getAllContact(){
String[] columnas = new String[] {ID, NOMBRE, TELEFONO, MAIL};
Cursor mCursor = dbHelper.query("t_contactos", columnas, null, null, null, null, null);
if (mCursor != null){
mCursor.moveToFirst();
}
return mCursor;
}
}
Et voici les messages d'erreur à partir de la LogCat:
E/AndroidRuntime( 636): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 636): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pfc.android/com.pfc.android.Prueba}: android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, nombre, telefono, mail FROM t_contactos
E/AndroidRuntime( 636): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 636): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 636): at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 636): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 636): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 636): at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 636): at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 636): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 636): at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 636): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 636): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 636): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 636): Caused by: android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, nombre, telefono, mail FROM t_contactos
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteProgram.native_compile(Native Method)
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1118)
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1006)
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:964)
E/AndroidRuntime( 636): at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1041)
E/AndroidRuntime( 636): at com.pfc.android.DataBaseAccess.getAllContact(DataBaseAccess.java:97)
E/AndroidRuntime( 636): at com.pfc.android.Prueba.onCreate(Prueba.java:21)
E/AndroidRuntime( 636): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 636): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 636): ... 11 more
Donc, quelqu'un peut-il aider à passer à travers?
Je vous remercie à l'avance !
OriginalL'auteur Kitinz | 2010-10-12
Vous devez vous connecter pour publier un commentaire.
Vous n'avez probablement pas avoir une colonne _id dans votre table de base de données. Tirez la base de données et l'ouvrir avec SqliteViewer pour vérifier s'il existe réellement. La base de données est généralement dans /data/data/com.yourapp.package/bases de données/
Vous pouvez utiliser:
http://sqlitebrowser.sourceforge.net/
ou
http://www.navicat.com/en/products/navicat_sqlite/sqlite_overview.html (ils ont aussi un gratuit version lite)
Essayer de le corriger à _id manuellement, peut-être un bug dans la méthode de création, pas sûr.
Tu veux le ré-écrire dans le SQLiteBrowser et obtenir le fichier sur le téléphone, non? Je vais essayer. De toute façon, im détecter quelque chose de bizarre. J'ai quelques traces dans le "onCreate" méthode où j'ai créer la base de données et de le remplir, mais je ne vois pas ces traces partout, donc, juste pour être sûr... Quand je crée un nouvel objet de la classe, après l'exécution du constructeur de la méthode, il exécutera le onCreate?
oui, poussez de nouveau le fichier dans le téléphone, est ce que je voulais dire. OnCreate: c'est seulement appelée automatiquement pour des Activités, pas pour tous les objets (simple java beans) en général.
OriginalL'auteur Mathias Conradt
Si vous avez créé la base de données par exemple avec des champs 'a', 'b' et 'c' et db alors si vous ajoutez un nouveau champ (ex. 'd'), vous devez recréer la base de données sur le téléphone (tout supprimer).
OriginalL'auteur Rustam Irzaev
Essayer
rowid
au lieu de_id
. Il fonctionne pour moi.OriginalL'auteur Ning
Droit, vous devez créer la base de données de la table avant de l'interrogation sur elle.
Voici un exemple:
Ensuite interroger sur elle ici:
Il apparaît également que l'absence d'un sixième argument de ce que vous interrogez. Voir où j'ai mis "" la méthode, chaîne de paramètre.
OriginalL'auteur Droid Chris
C'est peut existe 2 possibilités:
Votre question n'est pas à propos de l'Instruction SQL de problème. mais beaucoup de développeur peut penser Instruction SQL problème à propos de votre question.
Ce cas peut vérifier demaged de données dans votre fichier de base de données. Bien que vous ne pouvez pas utiliser de sélectionner les champs et la clause sql where par nom de champ.
En conséquence, vous ne pouvez pas utiliser la base de données de fichier dans votre code android.
Exactement la solution, je vous recommande de recréer SQLite fichier de base de données, étape par étape.
Vous devez être sauvegarde avant d'utiliser SQLite outil de modification. (SQLite Manager, Navigateur, d'autres db gérer les outils)
Si vous utilisez le même nom de fichier pour des actifs ou des données brutes lors de l'exécution avec les données modifiées,
vous pouvez essayer de désinstaller la précédente application installée pour l'actualisation.
OriginalL'auteur Go Namhyeon