2010-12-08 4 views
18

Hey je veux créer une base de données avec une colonne AUTO_INCREMENT. Mais je ne sais pas comment analyser la valeur dans la méthode insert. Je ne sais pas quoi analyser pour un argument AUTO_INCREMENT, et j'ai analysé 1 où devrait être auto_increment, mais je ne sais pas ce que je devrais analyser.Comment faire AUTO_INCREMENT sur la base de données Android SQLite?

Voici la classe CallDatHelper.java où je déclare la méthode insert et la méthode qui crée la base de données.

package com.psyhclo; 

import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.database.sqlite.SQLiteStatement; 
import android.util.Log; 

import java.util.ArrayList; 
import java.util.List; 

public class CallDataHelper { 

private static final String DATABASE_NAME = "calls.db"; 
private static final int DATABASE_VERSION = 1; 
private static final String TABLE_NAME = "contact_data"; 

private Context context; 
private SQLiteDatabase db; 

public CallDataHelper(Context context) { 
    this.context = context; 
    OpenHelper openHelper = new OpenHelper(this.context); 
    this.db = openHelper.getWritableDatabase(); 
} 

public boolean insert(Integer cId, String cName, String numType, 
     String cNum, String dur, String date, String currTime) { 
    this.db.execSQL("insert into " 
      + TABLE_NAME 
      + "(id, contact_id, contact_name, number_type, contact_number, duration, date, current_time, cont) " 
      + "values(? ," + cId + ", " + cName + ", " + numType + ", " 
      + cNum + ", " + dur + ", " + date + ", " + currTime + ", ?)"); 
    return true;   
} 

public void atualiza(String word) { 
    this.db.execSQL("UPDATE words SET cont = cont + 1 WHERE (word= ?)", 
      new String[] { word }); 
} 

public void deleteAll() { 
    this.db.delete(TABLE_NAME, null, null); 
} 

public boolean select(String wrd) { 

    String word; 
    Cursor cursor = this.db.query(TABLE_NAME, new String[] { "word" }, 
      "word like ?", new String[] { wrd }, null, null, null); 
    if (cursor.moveToFirst()) { 
     do { 
      word = cursor.getString(0); 
     } while (cursor.moveToNext()); 
    } 
    if (cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
     return true; 
    } else { 
     return false; 
    } 
} 

public List<String> selectAll() { 
    List<String> list = new ArrayList<String>(); 
    Cursor cursor = this.db.query(TABLE_NAME, new String[] { "word" }, 
      null, null, null, null, "cont desc"); 
    if (cursor.moveToFirst()) { 
     do { 
      list.add(cursor.getString(0).toUpperCase()); 
     } while (cursor.moveToNext()); 
    } 
    if (cursor != null && !cursor.isClosed()) { 
     cursor.close(); 
    } 
    return list; 
} 

private static class OpenHelper extends SQLiteOpenHelper { 

    OpenHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " 
       + TABLE_NAME 
       + "(id INTEGER PRIMARY KEY AUTOINCREMENT, contact_id INTEGER, contact_name VARCHAR(50), number_type VARCHAR(50), contact_number VARCHAR(50), duration TIME, date DATE, current_time TIME, cont INTEGER)"); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w("RatedCalls Database", 
       "Upgrading database, this will drop tables and recreate."); 
     db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 
     onCreate(db); 
    } 
} 
} 

Et voici où j'appelle la méthode d'insertion analyse les données que je veux insérer.

this.dh.insert(1 , 1, contactName, numType, contactNumber, 
        duration, callDate, currTime); 
+2

Permettez-moi une remarque de sécurité: construire manuellement des requêtes SQL comme celle-ci est une recette sûre pour obtenir piraté très difficile. Si un attaquant décide de la valeur de l'un de ces arguments, la requête peut être complètement modifiée. Voir plus d'informations ici: http://en.wikipedia.org/wiki/SQL_injection – MarioVilas

Répondre

13

Vous n'avez pas à analyser quoi que ce soit. Si la colonne a été créé comme AUTOINCREMENT, juste passer les autres valeurs:

db.execSQL("insert into " 
     + TABLE_NAME 
     + "(contact_id, contact_name, number_type, contact_number, duration, date, current_time, cont) " 
     + "values("+ cId + ", " + cName + ", " + numType + ", " 
     + cNum + ", " + dur + ", " + date + ", " + currTime + ", ?)"); 

Par ailleurs, il est toujours recommandé d'insérer des données en utilisant la méthode Android insert:

ContentValues values = new ContentValues(); 
values.put("contact_id", cId); 
values.put("contact_name", cName); 
// etc. 
db.insert(TABLE_NAME, null, values); 
+1

mais comment l'implémenter dans une autre classe? Mieux, comment appeler cette méthode sur l'autre classe, juste la référencer et analyser les bons arguments? – rogcg

+0

Eh bien ... vous avez déjà une méthode pour cela, il suffit de l'utiliser ... quel est le problème? – Cristian

+0

Je dis, la méthode db.insert doit être appelée sur l'activité droite? Mais pour appeler cette méthode, j'ai besoin d'initier l'objet db, qui est un objet SQLiteDatabase. Mais comment l'initier à l'activité? Je veux dire, SQLiteDatabase privé db = 'quoi ???'. – rogcg

1

this.db.insert (NULL, 1, contactName, numType, contactNumber, durée, callDate, currTime);

+5

Il n'y a pas de mot clé' NULL' dans Java. – Cristian

21

Vous n'avez pas besoin d'écrire spécifiquement AUTO_INCREMENT comme dans MYSQL.

Il suffit de définir le champ de clé primaire comme _id INTEGER PRIMARY KEY.

Cela ne fonctionnera pas si vous avez défini le champ Clé primaire avec INT lors de la création de la table. Il devrait être INTEGER et c'est tout.

Lorsque vous ne passez pas de valeur pour la clé primaire déposée lors de l'insertion des enregistrements, il augmente automatiquement la valeur à une valeur unique (même MYSQL AUTO_INCREMENT fonctionne)

+4

Il ne semble y avoir aucune mention de MySQL dans la question. – XTL

+5

Je pense que JibW fait juste une comparaison avec MySQL pour mieux expliquer les choses. – MarioVilas

+3

Haha, c'était mon problème. Je l'ai déclaré comme INT;) Merci. – Pijusn

1

static final Chaîne DATABASE_NAME = "EmpDB .db ";

public DatabaseHelper(Context context) { 
    super(context, Database_name, null, 1); 
} 
@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL("create table emp_tbl (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,salary TEXT)"); 
} 

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS tbl_emp"); 
} 

obtenir plus d'informations https://www.youtube.com/watch?v=W8-Z85oPNmQ Blog: https://itmulc.blogspot.com/2016/08/android-sqlite-database-with-complete.html

Questions connexes