Autore Topic: Aggiornare database senza creare duplicati  (Letto 896 volte)

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Aggiornare database senza creare duplicati
« il: 16 Gennaio 2013, 17:11:12 CET »
0
Salve ragazzi, una domanda spero semplice, ho un applicazione che all'avvio effettua il parsing di un xml e inserisce i dati dentro un db.
La domanda è: come faccio a far si che dopo il primo avvio, dove l'applicazione giustamente fa il parsing inserendo tutto l'xml nel db, ai successivi avvii essa non re-inserisca nuovamente i dati già presenti ma si limiti soltanto ad aggiornare il db, cioè ad inserire soltanto i nuovi dati?
Grazie  :-)
Domani Smetto.

Offline babsevensix

  • Nuovo arrivato
  • *
  • Post: 28
  • Respect: +1
    • Mostra profilo
Re:Aggiornare database senza creare duplicati
« Risposta #1 il: 16 Gennaio 2013, 17:22:50 CET »
+1
Beh, potresti identificare una chiave univoca sui dati XML e poi cercare sul db, se non esiste lo devi inserire

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Aggiornare database senza creare duplicati
« Risposta #2 il: 16 Gennaio 2013, 17:28:02 CET »
0
Beh, potresti identificare una chiave univoca sui dati XML e poi cercare sul db, se non esiste lo devi inserire
La chiave univoca l'avrei anche, ma come faccio a ricercare sul db e inserire se non è già presente?
grazie  :-)
Domani Smetto.

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Aggiornare database senza creare duplicati
« Risposta #3 il: 16 Gennaio 2013, 17:41:45 CET »
+1
La chiave univoca l'avrei anche, ma come faccio a ricercare sul db e inserire se non è già presente?
grazie  :-)
se la chiave del dato che stai per inserire e gia presente nel db allora il dato non viene inserito e viene segnalato un warning
quindi puoi anche solo fare un insert.se poi il dato e gia presente semplicemente non viene inserito

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Aggiornare database senza creare duplicati
« Risposta #4 il: 16 Gennaio 2013, 17:44:24 CET »
0
se la chiave del dato che stai per inserire e gia presente nel db allora il dato non viene inserito e viene segnalato un warning
quindi puoi anche solo fare un insert.se poi il dato e gia presente semplicemente non viene inserito
La parte dove inserisco i dati nel db è questa:
Codice (Java): [Seleziona]
  SQLiteDatabase database = (new DatabaseHelper(CT).getWritableDatabase());
            ContentValues values = new ContentValues();
            values.put("domain",  domain);
            values.put("program",  program);
            //values.put("description", description );
            values.put("end_date",  end_date);
            values.put("percentage",  percentage);
            values.put("discount",  discount);
            values.put("link", link);
           
           
            if(database!=null){
                database.insertOrThrow(TABLE_NAME, null, values);
                database.close();
            } else{
                Log.e("MyAppError", "Database is null");
            }
           }
                  }
                           

Come devo riscriverla in modo che se un dato è già presente non venga inserito?
grazie  :-)
Domani Smetto.

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
Re:Aggiornare database senza creare duplicati
« Risposta #5 il: 16 Gennaio 2013, 19:11:16 CET »
0
l'unica cosa che va modificata e la "create table" dove va inserito un vincolo di unique sui campi che non vuoi doppi

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Aggiornare database senza creare duplicati
« Risposta #6 il: 17 Gennaio 2013, 12:23:27 CET »
0
l'unica cosa che va modificata e la "create table" dove va inserito un vincolo di unique sui campi che non vuoi doppi

No non riesco a capire, se ho questo codice
Codice (Java): [Seleziona]
 SQLiteDatabase database = (new DatabaseHelper(CT).getWritableDatabase());
            ContentValues values = new ContentValues();
            values.put("domain",  domain);
            values.put("program",  program);
            //values.put("description", description );
            values.put("end_date",  end_date);
            values.put("percentage",  percentage);
            values.put("discount",  discount);
            values.put("link", link);
           
           
            if(database!=null){
                database.insertOrThrow(TABLE_NAME, null, values);
                database.close();
            } else{
                Log.e("MyAppError", "Database is null");
            }
           }
                  }

che mi inserisce i dati dentro il database, come devo modificarlo in modo che mi inserisca i dati nel database solo se trova il database vuoto, se invece trova già qualcosa all'interno delle tabelle del db non deve farlo.
Grazie  :-)
Domani Smetto.

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
R: Re:Aggiornare database senza creare duplicati
« Risposta #7 il: 17 Gennaio 2013, 16:13:04 CET »
0
No non riesco a capire, se ho questo codice
Codice (Java): [Seleziona]
 SQLiteDatabase database = (new DatabaseHelper(CT).getWritableDatabase());
            ContentValues values = new ContentValues();
            values.put("domain",  domain);
            values.put("program",  program);
            //values.put("description", description );
            values.put("end_date",  end_date);
            values.put("percentage",  percentage);
            values.put("discount",  discount);
            values.put("link", link);
           
           
            if(database!=null){
                database.insertOrThrow(TABLE_NAME, null, values);
                database.close();
            } else{
                Log.e("MyAppError", "Database is null");
            }
           }
                  }

che mi inserisce i dati dentro il database, come devo modificarlo in modo che mi inserisca i dati nel database solo se trova il database vuoto, se invece trova già qualcosa all'interno delle tabelle del db non deve farlo.
Grazie  :-)
Domanda.ma a te serve che lui controlli se i dati sono già presenti oppure solo se esiste il database??

Inviato dal mio Nexus 7 con Tapatalk 2

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Aggiornare database senza creare duplicati
« Risposta #8 il: 17 Gennaio 2013, 16:31:55 CET »
0
Mi serviva non tanto che il db esistesse ma che ci fossero dati dentro.
Ho risolto con :
Codice (Java): [Seleziona]
            Cursor cursor = database.query(TABLE_NAME, new String[] { coupon_id }, null, null, null, null, null);
            Log.e("COUNT", ""+cursor.getCount());
           
            if (cursor.getCount() == nl.getLength()){
                 
                 database.close(); }
            else
                 database.replace(TABLE_NAME, null, values);
                 database.close();  
                 cursor.close();
                 
                }
                 
              }        

Domani Smetto.

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Aggiornare database senza creare duplicati
« Risposta #9 il: 17 Gennaio 2013, 16:34:58 CET »
0
Altra domanda, ho questo messaggio di errore nel Logcat
Codice: [Seleziona]
01-17 15:07:49.161: E/Database(615): close() was never explicitly called on database '/data/data/it.coupapps1/databases/COUPAPPS_DATABASE'
01-17 15:07:49.161: E/Database(615): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
01-17 15:07:49.161: E/Database(615):         at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1847)
01-17 15:07:49.161: E/Database(615):         at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)
01-17 15:07:49.161: E/Database(615):         at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:854)
01-17 15:07:49.161: E/Database(615):         at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:847)
01-17 15:07:49.161: E/Database(615):         at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:544)
01-17 15:07:49.161: E/Database(615):         at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
01-17 15:07:49.161: E/Database(615):         at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:118)
01-17 15:07:49.161: E/Database(615):         at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
01-17 15:07:49.161: E/Database(615):         at it.coupapps1.Activity1$3.onClick(Activity1.java:87)
01-17 15:07:49.161: E/Database(615):         at android.view.View.performClick(View.java:2485)
01-17 15:07:49.161: E/Database(615):         at android.view.View$PerformClick.run(View.java:9080)
01-17 15:07:49.161: E/Database(615):         at android.os.Handler.handleCallback(Handler.java:587)
01-17 15:07:49.161: E/Database(615):         at android.os.Handler.dispatchMessage(Handler.java:92)
01-17 15:07:49.161: E/Database(615):         at android.os.Looper.loop(Looper.java:123)
01-17 15:07:49.161: E/Database(615):         at android.app.ActivityThread.main(ActivityThread.java:3683)
01-17 15:07:49.161: E/Database(615):         at java.lang.reflect.Method.invokeNative(Native Method)
01-17 15:07:49.161: E/Database(615):         at java.lang.reflect.Method.invoke(Method.java:507)
01-17 15:07:49.161: E/Database(615):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-17 15:07:49.161: E/Database(615):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-17 15:07:49.161: E/Database(615):         at dalvik.system.NativeStart.main(Native Method)

ma non riesco a trovare dove inserire il close del db, nella classe del database? o nell'activity?
Grazie  :-)
Domani Smetto.

Offline ciopper90

  • Utente junior
  • **
  • Post: 106
  • Respect: +4
    • Mostra profilo
R: Aggiornare database senza creare duplicati
« Risposta #10 il: 17 Gennaio 2013, 16:57:05 CET »
0
Prova a chiudere prima il cursore e poi il database

Inviato dal mio Nexus 7 con Tapatalk 2

Offline Valeboccaccio

  • Utente junior
  • **
  • Post: 75
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    SGSII
  • Sistema operativo:
    Windows 7
Re:Aggiornare database senza creare duplicati
« Risposta #11 il: 17 Gennaio 2013, 18:04:59 CET »
0
Ho risolto il db mi restava aperto in un' altra activity.
Grazie chiudo  :-)
Domani Smetto.