CRUD:我的`find()方法的一个SQLite实现`函数从不执行 [英] CRUD: my `find()` function on a SQLite implementation is never executed

查看:211
本文介绍了CRUD:我的`find()方法的一个SQLite实现`函数从不执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在一个小的应用程序,截获短信和坚持他们在一个本地数据库,
我想实现我的一个DAO查找方法。

In a small app that intercepts SMS and persists them in a local database, I'm trying to implement a find method in my DAO.

这是我所有的CRUD code:

this my all my CRUD code :

public class CSmsReceiverDAO implements IDAO<CSmsReceived> {
    private SQLiteDatabase bdd;
    private CMaBaseSQLite cMaBaseSQLite;
    private static final String NOM_BDD = "sms.db";
    private static final int VERSION_BDD = 1;

    private static final String COL_ID = "ID";
    private static final int NUM_COL_ID = 0;

    private static final String TABLE_SMS_SENT = "table_sms_sent";
    private static final String COL_DateSending = "dateSending";

    private static final String TABLE_SMS_RECEIVED = "table_sms_received";
    private static final String COL_DateReceiving = "dateReceiving";

    private static final int NUM_COL_DateReceiving = 1;

    private static final String COL_PROCESSED ="processed";
    private static final int NUM_COL_PROCESSED = 2;

    private static final String COL_PHONE ="phone";
    private static final int NUM_COL_PHONE= 3;

    private static final String COL_DATA ="data";
    private static final int NUM_COL_DATA= 4;


    public CSmsReceiverDAO(Context context){
        //On créer la BDD et sa table
        cMaBaseSQLite = new CMaBaseSQLite(context, NOM_BDD, null, VERSION_BDD);
    }

    public void open(){
        //on ouvre la BDD en écriture
        bdd = cMaBaseSQLite.getWritableDatabase();
    }

    public void close(){
        //on ferme l'accès à la BDD
        bdd.close();
    }

    public SQLiteDatabase getBDD(){
        return bdd;
    }

    @Override
    public CSmsReceived find(String date) throws Exception {
        //Récupère dans un Cursor les valeur correspondant à un livre contenu dans la BDD (ici on sélectionne le livre grâce à son titre)
        Cursor c = bdd.query(TABLE_SMS_RECEIVED, new String[] {COL_ID, COL_DateReceiving, COL_PROCESSED, COL_PHONE, COL_DATA}, COL_DateReceiving + " LIKE \"" + date +"\"", null, null, null, null);
        return cursorToSms(c);
    }

    @Override
    public List<CSmsReceived> findAll() throws Exception {
        return null;
    }

    @Override
    public void persist(CSmsReceived t) throws Exception {

        //Création d'un ContentValues (fonctionne comme une HashMap)
        ContentValues values = new ContentValues();
        //on lui ajoute une valeur associé à une clé (qui est le nom de la colonne dans laquelle on veut mettre la valeur)
        values.put(t.getDateReceiving(), NUM_COL_DateReceiving);
        values.put(t.getProcessed(), NUM_COL_PROCESSED);
        values.put(t.getPhone(), NUM_COL_PHONE);
        values.put(t.getData(), NUM_COL_DATA);

        //on insère l'objet dans la BDD via le ContentValues
        bdd.insert(TABLE_SMS_RECEIVED, null, values);
    }

    @Override
    public void remove(CSmsReceived t) throws Exception {

    }

    @Override
    public void update(CSmsReceived s, CSmsReceived t) throws Exception {

    }

    @Override
    public void refresh(CSmsReceived t) throws Exception {

    }

    //Cette méthode permet de convertir un cursor en un sms
    private CSmsReceived cursorToSms(Cursor c){
        //si aucun élément n'a été retourné dans la requête, on renvoie null
        if (c.getCount() == 0)
            return null;

        //Sinon on se place sur le premier élément
        c.moveToFirst();
        //On créé un sms
        //on lui affecte toutes les infos grâce aux infos contenues dans le Cursor
        CSmsReceived cSmsReceived = new CSmsReceived.SmsReceivedBuilder()
                .DateReceiving(c.getString(NUM_COL_DateReceiving))
                .Processed(c.getString(NUM_COL_PROCESSED)).Phone(c.getString(NUM_COL_PHONE))
                .Data(c.getString(NUM_COL_DATA)).build();
        //On ferme le cursor
        c.close();

        //On retourne le livre
        return cSmsReceived;
    }
}

我的SQL基础code:

My Sql Base code:

public class CMaBaseSQLite extends SQLiteOpenHelper {

    private static final String COL_ID = "ID";

    private static final String TABLE_SMS_SENT = "table_sms_sent";
    private static final String COL_DateSending = "dateSending";

    private static final String TABLE_SMS_RECEIVED = "table_sms_received";
    private static final String COL_DateReceiving = "dateReceiving";
    private static final String COL_PROCESSED ="processed";

    private static final String COL_PHONE ="phone";
    private static final String COL_DATA ="data";

    private static final String CREATE_BDD_SMS_RECEIVED = "CREATE TABLE " + TABLE_SMS_RECEIVED + " ("
            + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_DateReceiving + "TEXT, "
            + COL_PROCESSED + "TEXT, " + COL_PHONE + "TEXT, " + COL_DATA + "TEXT);";

    private static final String CREATE_BDD_SMS_SENT = "CREATE TABLE " + TABLE_SMS_SENT + " ("
            + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_DateSending + "TEXT, "
            + COL_PHONE + "TEXT, " + COL_DATA + "TEXT NOT NULL);";

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

    @Override
    public void onCreate(SQLiteDatabase db) {
        //on créé la table à partir de la requête écrite dans la variable CREATE_BDD sent et received
        db.execSQL(CREATE_BDD_SMS_RECEIVED);
        //db.execSQL(CREATE_BDD_SMS_SENT);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        //On peut fait ce qu'on veut ici moi j'ai décidé de supprimer la table et de la recréer
        //comme ça lorsque je change la version les id repartent de 0
        //db.execSQL("DROP TABLE " + TABLE_SMS_SENT + ";");
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_SMS_RECEIVED + ";");
        onCreate(db);
    }

这是我的活动:

CSmsReceiverDAO cSmsReceiverDAO = new CSmsReceiverDAO(this);
CSmsReceived SmsReceived1 = new CSmsReceived.SmsReceivedBuilder()
        .Data("coords XY").DateReceiving("janvier").Phone("+33565456").Processed("zz").build();

cSmsReceiverDAO.open();

try {
    Log.i("test","try ok");
    cSmsReceiverDAO.persist(SmsReceived1);
    Log.i("test", "persist ok");
    CSmsReceived smsFromBdd = cSmsReceiverDAO.find(SmsReceived1.getDateReceiving());
    Log.i("test", "find ok");

    if (smsFromBdd !=null){
        Toast.makeText(this, smsFromBdd.toString(), Toast.LENGTH_LONG).show();
    }
    else {
        Toast.makeText(this, "persist fail...", Toast.LENGTH_LONG).show();

    }

} catch (Exception e) {
    e.printStackTrace();
}

在我的日志,永远不会执行find方法,但我不明白为什么。

In my logs, the find method is never executed, but I don't understand why.

02-14 17:25:09.460 7571-7571/com.dev.boblinux.cador I/test: try ok
02-14 17:25:09.470 7571-7571/com.dev.boblinux.cador I/test: persist ok

编辑:感谢Hrundi V.巴克什

现在我的日志:

尝试确定
坚持OK
找到确定

但并没有什么对我smsFromBdd:

but there is nothing on my smsFromBdd :

        `if (smsFromBdd !=null){
            Toast.makeText(this, smsFromBdd.toString(), Toast.LENGTH_LONG).show();
        }
        else {
            Toast.makeText(this, "persist fail...", Toast.LENGTH_LONG).show();

        }`

显示一直存在失败...

推荐答案

您没有从它们的类型分开你的字段名。结果
因此,该表​​的格式不正确。结果
而执行 cSmsReceiverDAO.find()

You aren't separating your field names from their types.
Therefore, the table is malformed.
And your app is aborting when executing cSmsReceiverDAO.find()

您需要的空格字段名和字段类型之间。

You need spaces between the field names and the field types.

private static final String CREATE_BDD_SMS_RECEIVED = "CREATE TABLE " + TABLE_SMS_RECEIVED + " ("
        + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_DateReceiving + " TEXT, "
        + COL_PROCESSED + " TEXT, " + COL_PHONE + " TEXT, " + COL_DATA + " TEXT);";

private static final String CREATE_BDD_SMS_SENT = "CREATE TABLE " + TABLE_SMS_SENT + " ("
        + COL_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COL_DateSending + " TEXT, "
        + COL_PHONE + " TEXT, " + COL_DATA + " TEXT NOT NULL);";

然后,你需要卸载你的应用程序并重新运行它,为了使数据库重新创建。

Then you need to uninstall your app and re-run it, in order for the database to be recreated.

这篇关于CRUD:我的`find()方法的一个SQLite实现`函数从不执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆