Autore Topic: Problema di inserimento nel DB sqLite  (Letto 605 volte)

Offline AliceInWonderland

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: +1
    • Github
    • Google+
    • Raffaella Pivetta
    • pivetta.raffaella@hotmail.it
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy nexus ( android 4.3 )
  • Sistema operativo:
    window 7
Problema di inserimento nel DB sqLite
« il: 20 Aprile 2012, 11:50:43 CEST »
0
Ciao a tutti ho un problema con la popolazione di un DB sqlite.
 
questo è il mio metodo di inserimento nella mia classe Dao

Codice (Java): [Seleziona]
public void insertOndbFeedBack(MyFeedBack mFeedback) throws Exception{
                try{
                        ContentValues values =new ContentValues();
                        values.put(DataBaseStorageFeedBack.COLUMN_ID,""+ mFeedback.getKeyFeedback() +"");
                        values.put(DataBaseStorageFeedBack.COLUMN_NAME_APPLICATION,""+ mFeedback.getNameApp()+"");
                        values.put(DataBaseStorageFeedBack.COLUMN_SERIAL_DEVICE, ""+ mFeedback.getSerialDevice() +"");
                        values.put(DataBaseStorageFeedBack.COLUMN_TIME_STAMP, mFeedback.getTimeStamp());
                        values.put(DataBaseStorageFeedBack.COLUMN_TEXT_FEEDBACK, ""+ mFeedback.getTextFeedback() + "");
                        long insertId =database.insert(DataBaseStorageFeedBack.TABLE_FEEDBACK, null, values);
                       
                } catch (Exception e) {
                        e.printStackTrace();
                }
        };

questo è il mio Helper:

Codice (Java): [Seleziona]
public class DataBaseStorageFeedBack  extends SQLiteOpenHelper {
       
        static final String TABLE_FEEDBACK = "FeedBack";
       
        static final String COLUMN_ID="id";
        static final String COLUMN_NAME_APPLICATION= "nameapplicazione";
        static final String COLUMN_SERIAL_DEVICE="serial";
        static final String COLUMN_TIME_STAMP="timestamp";
        static final String COLUMN_TEXT_FEEDBACK= "textfeedback";
       
        // shared index, make sure to match COLUMNS
        static final int COLUMN_ID_INDEX= 0;
        static final int COLUMN_NAME_APPLICATION_INDEX=1;
        static final int COLUMN_SERIAL_DEVICE_INDEX=2;
        static final int COLUMN_TIME_STAMP_INDEX=3;
        static final int COLUMN_TEXT_FEEDBACK_INDEX= 4;
       
        /** this is the version of DB.
         *  we must increase this number when the DB  is change **/

        private  static  final  int DATABASE_VERSION =  1;
        /** this's the DB's name**/
        private static final String DATABASE_NAME= "MyFeedBack.db";
        /** this 's the query that we use for create the table
         *  Android use the _id  for identify the element's key **/

        private static final String DATABASE_CREATE = "create table " + TABLE_FEEDBACK + "("
                        + COLUMN_ID + " _id PRIMARY KEY, "
                        + COLUMN_NAME_APPLICATION + " TEXT NOT NULL,"
                        + COLUMN_SERIAL_DEVICE + " TEXT NOT NULL,"
                        + COLUMN_TIME_STAMP + " LONG NOT NULL,"
                        + COLUMN_TEXT_FEEDBACK + " TEXT NOT NULL "
                        + ");";
       
        public DataBaseStorageFeedBack(Context context){
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }
        /**with this method we create the table. onCreate(---) is called when we created DB for the first time
         * or better when the application is just installed **/

        @Override
        public void onCreate(SQLiteDatabase db) {
                /*we use execSQL(---) if we want execute SQL's code*/
                db.execSQL(DATABASE_CREATE);
               
        }
        /** this method in called when DB just exist but, the when the number version is absolutely.
         * Usually it's called when the number Version of an application just exist is changed
         * This method allows you to update the database schema.**/

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Log.w(DataBaseStorageFeedBack.class.getName(),"Upgrading database from version " + oldVersion + " to "
                                + newVersion + ", which will destroy all old data");
                db.execSQL("DROP TABLE IF EXISTS " + TABLE_FEEDBACK);
                onCreate(db);
        }
}

e per finire il log cat:
Codice: [Seleziona]
04-20 11:42:50.712: E/SQLiteDatabase(4730): Error inserting timestamp=6549805572518 id=35155405330631321310996486549805603036 textfeedback=viao nameapplicazione=2131099648 serial=351554053306313
04-20 11:42:50.712: E/SQLiteDatabase(4730): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at sogetel.pivetta.CapturEvent.database.MyFeedBackDao.insertOndbFeedBack(MyFeedBackDao.java:65)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at sogetel.pivetta.CapturEvent.control.ControlApplication.saveOnDbFeedBack(ControlApplication.java:54)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at sogetel.pivetta.CapturEvent.listener.Listner2.createFeedback(Listner2.java:57)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at sogetel.pivetta.CapturEvent.listener.Listner2.onClick(Listner2.java:40)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.view.View.performClick(View.java:3511)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.view.View$PerformClick.run(View.java:14105)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.os.Handler.handleCallback(Handler.java:605)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.os.Handler.dispatchMessage(Handler.java:92)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.os.Looper.loop(Looper.java:137)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at android.app.ActivityThread.main(ActivityThread.java:4424)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at java.lang.reflect.Method.invokeNative(Native Method)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at java.lang.reflect.Method.invoke(Method.java:511)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
04-20 11:42:50.712: E/SQLiteDatabase(4730):         at dalvik.system.NativeStart.main(Native Method)


ho provato di tutto anche con le query esplicite ma continua a darmi errore anzi fino a ieri mi dice che non trovava le colonne.....e oggi ha cambiato errore.. :-\ oltretutto il database viene creato. Non so proprio cosa fare ... ho seguito al guida Android SQLite Database and ContentProvider - Tutorial e mi pare di avere fatto tutto uguale ma.. non so proprio come fare......
Help meeee pleaseee !!!!
Raffaella

Offline pivoide

  • Utente junior
  • **
  • Post: 133
  • Respect: +19
    • Mostra profilo
  • Dispositivo Android:
    Samsung galaxy tab 10.1
  • Play Store ID:
    codicerosso
  • Sistema operativo:
    Ubuntu 11.04
Re:Problema di inserimento nel DB sqLite
« Risposta #1 il: 20 Aprile 2012, 12:06:05 CEST »
0
Probabilmente stai inserendo una chiave duplicata
Odio l'inglese e per un informatico non è il massimo

Offline AliceInWonderland

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: +1
    • Github
    • Google+
    • Raffaella Pivetta
    • pivetta.raffaella@hotmail.it
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy nexus ( android 4.3 )
  • Sistema operativo:
    window 7
Re:Problema di inserimento nel DB sqLite
« Risposta #2 il: 20 Aprile 2012, 12:11:01 CEST »
0
la chiave come può essere duplicata?? è formata dal nome applicazione, serial device e dal time stamp e non può essere duplicata cioè il time stamp lo prendo al momento in cui catturo l'evento :

Codice (Java): [Seleziona]
private void createFeedback() {
               
                mfeedback= new MyFeedBack();
                mfeedback.setTimeStamp(getTimeStamp());
                mfeedback.setNameApp(getNameApp());
                mfeedback.setTextFeedback(textFeedback.getText().toString());
                mfeedback.setSerialDevice(getSerialDevice());
                mfeedback.setKeyFeedBack(createKeyFeedBack());
                mfeedback.setC(getC());
                ControlApplication.getControlApplication().saveOnDbFeedBack(mfeedback);
                Toast.makeText(c,"Feedback posted ", Toast.LENGTH_LONG).show();
       
                //      List<MyFeedBack> m =ControlApplication.getControlApplication().getOnDbAllFeedBack();
        }

private String createKeyFeedBack() {
                return getSerialDevice() + getNameApp() + getTimeStamp();
        }

public long getTimeStamp(){
                return System.nanoTime() ;
        }

quindi il time Stamp dovrebbe garantire la non presenza di chiavi doppie.... almeno credo...



« Ultima modifica: 20 Aprile 2012, 12:41:17 CEST da lella_84 »
Raffaella

Offline AliceInWonderland

  • Nuovo arrivato
  • *
  • Post: 23
  • Respect: +1
    • Github
    • Google+
    • Raffaella Pivetta
    • pivetta.raffaella@hotmail.it
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy nexus ( android 4.3 )
  • Sistema operativo:
    window 7
Re:Problema di inserimento nel DB sqLite
« Risposta #3 il: 20 Aprile 2012, 13:07:05 CEST »
0
Risolto.. c'èra un errore in :

Codice (Java): [Seleziona]
+ COLUMN_ID + " _id PRIMARY KEY, "
doveva essere:

Codice (Java): [Seleziona]
+ COLUMN_ID + " _id TEXT PRIMARY KEY, "
Raffaella