2016-02-19 2 views
0

Я пытаюсь implemente андроид приложение, которое получает смс и сохраняются его в местном dabase, здесь мы будем использовать Sqlite,найти Crud SQLITE андроида реализации

в моей основной деятельности я стараюсь оставаться смс, а затем , я стараюсь читать его из моей базы данных, но я не могу, ль найти() строка никогда не выполняется (то, что говорит мои журналы), вот какой-то код моей основной деятельности:

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(); 
     } 

и мои журналы:

02-19 07:19:23.087 2837-2837/? I/test: try ok 
02-19 07:19:23.087 2837-2837/? I/test: persist ok 

, но у меня нет строки «find ok».

вот как я построю свои смс (я использую строитель шаблон):

public class CSmsReceived implements Serializable{ 
    private final String dateReceiving; // optional 
    private final String processed; // optional 
    private final String phone; // optional 
    private final String data; // optional 

    private CSmsReceived(SmsReceivedBuilder builder) { 
     this.dateReceiving = builder.dateReceiving; 
     this.processed = builder.processed; 
     this.phone = builder.phone; 
     this.data = builder.data; 
    } 

    public String getDateReceiving() { 
     return dateReceiving; 
    } 

    public String getProcessed() { 
     return processed; 
    } 

    public String getPhone() { 
     return phone; 
    } 

    public String getData() { 
     return data; 
    } 

    public String toString(){ 
     return "dateReceiving : " + dateReceiving + " processed : " + processed +"\n" 
       + " phone : " + phone + " data : " + data; 
    } 

    public static class SmsReceivedBuilder { 
     private String dateReceiving; 
     private String processed; 
     private String phone; 
     private String data; 

     public SmsReceivedBuilder Data(String data) { 
      this.data = data; 
      return this; 
     } 

     public SmsReceivedBuilder DateReceiving(String dateReceiving) { 
      this.dateReceiving = dateReceiving; 
      return this; 
     } 

     public SmsReceivedBuilder Phone(String phone) { 
      this.phone = phone; 
      return this; 
     } 

     public SmsReceivedBuilder Processed(String processed) { 
      this.processed = processed; 
      return this; 
     } 


     public CSmsReceived build() { 
      return new CSmsReceived(this); 
     } 

    } 
} 

и вот моя база данные создания: (подключение и создавать таблицы)

редактировать: Попробуйте CREATE TABLE IF NOT сУЩЕСТВУЕТ - @Prithviraj Shiroor, но это ничего не меняет

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 IF NOT EXISTS " + 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 IF NOT EXISTS" + 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); 
    } 

} 

и, наконец, моя smsDAO:

EDIT: упорствовать метод debuged

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); 

=>

values.put(COL_DateReceiving,t.getDateReceiving()); 
     values.put(COL_PROCESSED, t.getProcessed()); 
     values.put(COL_PHONE, t.getPhone()); 
     values.put(COL_DATA, t.getData()); 

теперь мой код:

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(COL_DateReceiving,t.getDateReceiving()); 
     values.put(COL_PROCESSED, t.getProcessed()); 
     values.put(COL_PHONE, t.getPhone()); 
     values.put(COL_DATA, t.getData()); 

     //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; 
    } 
} 

так почему мой метод находкой не работает?

как @Elite говорит, бревенчатый кошка может быть интересно (журнал обновляется):

02-19 08:12:29.568 8463-8463/? I/art: Not late-enabling -Xcheck:jni (already on) 
02-19 08:12:29.592 8463-8463/? W/System: ClassLoader referenced unknown path: /data/app/com.dev.boblinux.cador-1/lib/x86 
02-19 08:12:29.592 8463-8471/? E/art: Failed writing handshake bytes (-1 of 14): Broken pipe 
02-19 08:12:29.592 8463-8471/? I/art: Debugger is no longer active 
02-19 08:12:29.599 8463-8463/? I/GMPM: App measurement is starting up, version: 8487 
02-19 08:12:29.599 8463-8463/? I/GMPM: To enable debug logging run: adb shell setprop log.tag.GMPM VERBOSE 
02-19 08:12:29.603 8463-8463/? E/GMPM: GoogleService failed to initialize, status: 10, Missing an expected resource: 'R.string.google_app_id' for initializing Google services. Possible causes are missing google-services.json or com.google.gms.google-services gradle plugin. 
02-19 08:12:29.603 8463-8463/? E/GMPM: Scheduler not set. Not logging error/warn. 
02-19 08:12:29.632 8463-8479/? E/GMPM: Uploading is not possible. App measurement disabled 
02-19 08:12:29.644 8463-8463/? I/test: try ok 
02-19 08:12:29.644 8463-8463/? E/SQLiteLog: (1) no such table: table_sms_received 
02-19 08:12:29.644 8463-8463/? E/SQLiteDatabase: Error inserting phone=+33565456 processed=zz dateReceiving=janvier data=coords XY 
               android.database.sqlite.SQLiteException: no such table: table_sms_received (code 1): , while compiling: INSERT INTO table_sms_received(phone,processed,dateReceiving,data) VALUES (?,?,?,?) 
                at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
                at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887) 
                at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498) 
                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 com.dev.boblinux.cador.bdd.CSmsReceiverDAO.persist(CSmsReceiverDAO.java:85) 
                at com.dev.boblinux.cador.activities.CMainActivity.onCreate(CMainActivity.java:43) 
                at android.app.Activity.performCreate(Activity.java:6237) 
                at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
                at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
                at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:148) 
                at android.app.ActivityThread.main(ActivityThread.java:5417) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
02-19 08:12:29.644 8463-8463/? I/test: persist ok 
02-19 08:12:29.644 8463-8463/? E/SQLiteLog: (1) no such table: table_sms_received 
02-19 08:12:29.645 8463-8463/? W/System.err: android.database.sqlite.SQLiteException: no such table: table_sms_received (code 1): , while compiling: SELECT ID, dateReceiving, processed, phone, data FROM table_sms_received WHERE dateReceiving LIKE "janvier" 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:887) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:498) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1163) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1034) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1202) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at com.dev.boblinux.cador.bdd.CSmsReceiverDAO.find(CSmsReceiverDAO.java:64) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at com.dev.boblinux.cador.activities.CMainActivity.onCreate(CMainActivity.java:45) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.app.Activity.performCreate(Activity.java:6237) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.app.ActivityThread.-wrap11(ActivityThread.java) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:102) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.os.Looper.loop(Looper.java:148) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at java.lang.reflect.Method.invoke(Native Method) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
02-19 08:12:29.645 8463-8463/? W/System.err:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
02-19 08:12:29.669 8463-8481/? D/OpenGLRenderer: Use EGL_SWAP_BEHAVIOR_PRESERVED: true 
02-19 08:12:29.801 8463-8481/? I/OpenGLRenderer: Initialized EGL, version 1.4 
02-19 08:12:29.866 8463-8481/? W/EGL_emulation: eglSurfaceAttrib not implemented 
02-19 08:12:29.866 8463-8481/? W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad760be0, error=EGL_SUCCESS 
02-19 08:12:30.483 8463-8463/? I/Choreographer: Skipped 45 frames! The application may be doing too much work on its main thread. 

почему я не могу создать свой стол table_sms_received? (Это, кажется, главная проблема

+1

У вас есть лицо по ошибке..если так предоставить лог-код. – ELITE

+0

вы правы, я просто вижу странное сообщение и действительно интересно (я его публикую) – boblinux

+1

Это означает, что таблица не присутствует – ELITE

ответ

0
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); 

=>

values.put(COL_DateReceiving,t.getDateReceiving()); 
     values.put(COL_PROCESSED, t.getProcessed()); 
     values.put(COL_PHONE, t.getPhone()); 
     values.put(COL_DATA, t.getData()); 

и при изменении какой-то код, вы должны деинсталлировать и повторно установить приложение (обязательно!), Чтобы переделайте новую базу данных, а затем это сработает.

+1

'когда вы меняете какой-то код, вам нужно удалить и переустановить приложение ** ** **. Только при изменении структуры базы данных. –