Autore Topic: Creazione e gestione database  (Letto 2020 volte)

Offline eversor

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Creazione e gestione database
« il: 01 Ottobre 2010, 14:09:15 CEST »
0
Innazitutto un saluto al forum sono nuovo,
ho iniziato ora a "studiare" un po come funziona android e mi sto dilettando nella creazione di semplici applicazioni didattiche per esercitarmi un po.
In particolare sto cercando di capire come gestire un database con android: dopo un po di documentazione sono arrivato a scrivere quanto segue:
Una prima classe che estende SQLiteOpenHelper:
Codice (Java): [Seleziona]
public class MyDBHelper extends SQLiteOpenHelper {

        public MyDBHelper(Context context) {
                super(context, "mydatabase.db", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
                String query = "CREATE TABLE table1"
                        + "(ID INTEGER AUTO_INCREMENT PRIMARY KEY,"
                        + "row1 TEXT,"
                        + "row2 TEXT"
                        + ");";
                db.execSQL(query);
        }

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

Una seconda clesse per gestire inserimenti e cancellazioni
Codice (Java): [Seleziona]
public class MyDBManager {
       
        private MyDBHelper dbh;
       
        public MyDBManager(Context c) {
                dbh = new MyDBHelper(c);
        }
       
        public void insert(String value1, String value2) {
                SQLiteDatabase db = dbh.getWritableDatabase();
                try {
                        ContentValues values = new ContentValues();
                        values.put("row1", value1);
                        values.put("row2", value2);
                        db.insert("table1", "", values);
                } finally {
                        if(db!= null)
                                db.close();
                }
        }
       
        public ArrayList<String> selectAll() {
                SQLiteDatabase db = dbh.getReadableDatabase();
                try {
                        ArrayList<String> results = new ArrayList<String>();
                        Cursor c = db.rawQuery("select * from table1", null);
                        if (c.getCount() > 0) {
                                c.moveToFirst();
                                do {
                                        results.add(c.getString(c.getColumnIndex("row1")));
                                        results.add(c.getString(c.getColumnIndex("row2")));
                                } while (c.moveToNext());
                        }
                        return results;
                } finally {
                        if (db != null)
                                db.close();
                }
        }
}

ed infine una action che richiama la precedente classe (la parte significativa è la seguente):
Codice (Java): [Seleziona]
MyDBManager dm = new MyDBManager(getBaseContext());
dm.insert(value1, value2);
ArrayList<String> result = new ArrayList<String>();
result = dm.selectAll();

Ora ho due problemi: primo, il database non viene creato, ho provato inizialmente a sorvolare e ho creato manualmente il database in data/data/org.miopackege/databases come da documentazione e ho eseguito delle query da terminale ed è tutto ok;
secondo problema: quando provo ad eseguire il metodo selectAll() la mia applicazione crasha, controllando gli errori mi viene detto
"10-01 14:02:19.236: ERROR/AndroidRuntime(1058): Caused by: android.database.sqlite.SQLiteException: no such table: android_metadata"
Mi sapete dare qualche dritta per capire gli errori?

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #1 il: 01 Ottobre 2010, 14:23:35 CEST »
0
Il database non viene creato perchè probabilmente viene sollevata una qualche eccezione, hai controllato?
Comunque prova a usare come nome del campo id "_id".

Il secondo errore probabilmente è dovuto al fatto che avendo creato con un tool esterno il db mancano delle informazioni che android di solito crea in automatico.

Ti invio a leggere: [medio] Creazione e utilizzo di un database SQLite - Android Developers Italia

Offline eversor

  • Nuovo arrivato
  • *
  • Post: 6
  • Respect: 0
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #2 il: 01 Ottobre 2010, 14:44:50 CEST »
0
Accidenti era proprio il campo id andava chiamato "_id" con questa modifica funziona tutto.... grazie!

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #3 il: 25 Ottobre 2010, 16:32:36 CEST »
0
Ciao. Sto creando un metodo per la lettura delle righe di una tabella del database che mi salvi il tutto in un ArrayList.
Quando nel LogCat vado poi a stampare il contenuto dell'ArrayList in questione mi scrive per 4 volte (in quanto ci sono 4 righe nel DB) l'ultima riga.

Questo è il mio metodo:

Codice (Java): [Seleziona]
 public ArrayList<MyArt> selectAll() {
                 
                 MyArt newArt=new MyArt();
         try {
                 ArrayList<MyArt> results = new ArrayList<MyArt>();
                 Cursor c = mDb.rawQuery("select * from products", null);
                 if (c.getCount() > 0) {
                         c.moveToFirst();
                       
                                 do {
                                 
                                 
                                         newArt.setId(c.getString(c.getColumnIndex("IDAR")));
                                         newArt.setArti(c.getString(c.getColumnIndex("NOMEAR")));
                                         newArt.setQuta(c.getString(c.getColumnIndex("QTAAR")));
                                 
                                         results.add(newArt);
                                 
                                 } while(c.moveToNext());    
                       
                         
                 }
                 return results;
         } finally {
                // if (mDb != null)
                         //mDb.close();
         }
 }



Che vado a chiamare nel seguente modo:

Codice (Java): [Seleziona]
ArrayList<MyArt> result = new ArrayList<MyArt>();
        result = db2.selectAll();
       
        for(int j=0;j<result.size();j++)
                Log.i("CIAOOOO",result.get(j).getId()+result.get(j).getArti()+result.get(j).getQuta());

Ma come risultato nel LogCat ho:
10-25 14:25:11.280: INFO/CIAOOOO(495): 26Uova32
10-25 14:25:11.280: INFO/CIAOOOO(495): 26Uova32
10-25 14:25:11.280: INFO/CIAOOOO(495): 26Uova32
10-25 14:25:11.280: INFO/CIAOOOO(495): 26Uova32


Cioè mi becca solo l'utlima riga della tabella del DB.
Non riesco a capire il perchè.
Vi ringrazio.
Ciao.

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #4 il: 25 Ottobre 2010, 16:46:25 CEST »
0
Risolto banalmente spostando:

 MyArt newArt=new MyArt();

all'interno del do.

Ciao alla prossima!

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #5 il: 29 Ottobre 2010, 16:54:25 CEST »
0
Buon pomeriggio a tutti!

Sto creando una tabella per il mio database
In questa tabella voglio creare i seguenti campi:

id _articolo di tipo intero
nome_articolo di tipo string
noncibo_articolo di tipo boolean
uriimg_articolo di tipo Uri (se possibile)

Volevo chiedere, in quanto mi da errori, come poter creare campi di tipo intero e campi di tipo uri(se possibile) nella mia tabella del database.
Quello che sto facendo è la seguente cosa:

Codice (Java): [Seleziona]
package ch.egsolutions.databasetutorial;

import java.util.ArrayList;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.net.Uri;
import android.util.Log;

public class MyDatabase2 {  
       
        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;
        private static final String DB_NAME="lista_spesa2";//nome del db
        private static final int DB_VERSION=1; //numero di versione del nostro db
       
        public MyDatabase2(Context ctx){
                mContext=ctx;
                mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);   //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)    
        }
       
        public void open(){  //il database su cui agiamo è leggibile/scrivibile
                mDb=mDbHelper.getWritableDatabase();
               
        }
       
       
       
       
        public void close(){ //chiudiamo il database su cui agiamo
                mDb.close();
        }
       
       
        //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
       
        public void insertProduct(int IDAR, String NOMEAR, Boolean NONCIBOAR, Uri URIIMG){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                cv.put(ProductsMetaData.PRODUCT_ID_KEY, IDAR);
                cv.put(ProductsMetaData.PRODUCT_NOME_KEY, NOMEAR);
                cv.put(ProductsMetaData.PRODUCT_NONCIBO_KEY, NONCIBOAR);
                cv.put(ProductsMetaData.PRODUCT_URIIMG_KEY, URIIMG);
                //cv.put(ProductsMetaData.PRODUCT_PRESO_KEY, CHECK);
                mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, cv);
        }
       
       
        //Metodo per cancellare tutte le righe della tabella products
       
         public void deleteAll(){
                mDb.delete("prodotti", null, null);
        }

         
         
        //metodo per fare la query di tutti i dati
        public Cursor fetchProducts(){
                return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,null,null,null,null,null);              
        }

        // i metadati della tabella, accessibili ovunque
        static class ProductsMetaData {  
                static final String PRODUCTS_TABLE = "prodotti";
                static final String ID = "_id";
                static final int PRODUCT_ID_KEY = "IDAR";
                static final String PRODUCT_NOME_KEY = "NOMEAR";
                static final boolean PRODUCT_NONCIBO_KEY = "NONCIBOAR" != null;
                static final String PRODUCT_URIIMG_KEY = "URIIMG";
                //static final Boolean PRODUCT_PRESO_KEY = CHECK;
               
        }

       
        //codice sql di creazione della tabella
        private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  
                        + ProductsMetaData.PRODUCTS_TABLE + " ("
                        + ProductsMetaData.ID+ " integer primary key autoincrement, "
                        + ProductsMetaData.PRODUCT_ID_KEY + " integer, "
                        + ProductsMetaData.PRODUCT_NOME_KEY + " text not null, "
                        + ProductsMetaData.PRODUCT_URIIMG_KEY + " text not null, "
                        + ProductsMetaData.PRODUCT_NONCIBO_KEY + " boolean not null);";
                //+ ProductsMetaData.PRODUCT_PRESO_KEY + "  boolean);";

       
        //classe che ci aiuta nella creazione del db
        private class DbHelper extends SQLiteOpenHelper {

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

               
                //solo quando il db viene creato, creiamo la tabella
                @Override
                public void onCreate(SQLiteDatabase _db) {
                        _db.execSQL(PRODUCTS_TABLE_CREATE);
                       
                }

               
                //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app,
                //il db cambia numero di versione
                @Override
                public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                       

                }

        }
}

Non capisco dove sto sbagliando nella creazione dei campi.
Grazie a tutti!
« Ultima modifica: 29 Ottobre 2010, 16:56:41 CEST da Sangio85 »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #6 il: 29 Ottobre 2010, 17:57:37 CEST »
0
Sarebbe meglio che tu postassi l'output del logcat

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #7 il: 29 Ottobre 2010, 18:07:04 CEST »
0
Dovrei aver sistemato...cmq quando farò una prova concreta del funzionamento del db scrivo se è tutto ok o se ci sono problemi.
Grazie 1000 Ricky!
Ciao!

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #8 il: 30 Ottobre 2010, 11:14:54 CEST »
0
Ciao ragazzi!
Ho due problemi con il mio db che non riesco a capire.

Posto prima il mio codice e poi il LOGCAT

Demo.java
Codice (Java): [Seleziona]
package ch.egsolutions.databasetutorial;

import java.util.ArrayList;


import android.app.Activity;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.Typeface;
import android.graphics.drawable.GradientDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.TextView;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.ArrayList;

import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import android.util.Log;


public class Demo extends Activity {
       
   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        ImageView image=(ImageView)findViewById(R.id.ImageView01);
        String myJpgPath = "/mnt/sdcard/frova.jpg";
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inSampleSize = 5;
        Bitmap bm = BitmapFactory.decodeFile(myJpgPath, options);
        image.setImageBitmap(bm);
       
       
        String xmlUrl2="http://ortobotanico.altervista.org/articoli.xml";
        MyParser3 parser2=new MyParser3(); //otteniamo un istanza del nostro parser
        parser2.parseXml(xmlUrl2);//usiamo il parser
       
        ArrayList<MyArt> AR2 = new ArrayList<MyArt> (parser2.getParsedData());
       
       
        TextView productsTv=(TextView)findViewById(R.id.productsTv);
        productsTv.setTypeface(Typeface.createFromAsset(getAssets(),"kberry.ttf"));  
        //caricamento di un font esterno, piazzato nella cartella assets
       
        ListView productsLv=(ListView)findViewById(R.id.productsLv);
       
        MyDatabase db2=new MyDatabase(getApplicationContext());
        db2.open();  //apriamo il db
           
        db2.deleteAll();
       
       
        if(db2.fetchProducts().getCount()==0){//inserimento dati
       
                for(int h=0; h<AR2.size();h++)
                {
                          db2.insertProduct(AR2.get(h).getId(),AR2.get(h).getArti(),AR2.get(h).getUri());
                }
     
        }
       
        //Salviamo i dati UTILI aggiornati dal database per poi poterli passare ad un file xml
        //da inviare al server che poi li deserializzerà aggiornando il DATABASE ANFASS
        ArrayList<MyArt> result = new ArrayList<MyArt>();
        result = db2.selectAll();
        for(int j=0;j<result.size();j++)
                Log.i("CIAOOOO",result.get(j).getId()+result.get(j).getArti()+result.get(j).getUri());
                       
       
        // query che ci restituisce tutti i prodotti in lista e li passa ad un Cursor
        Cursor c=db2.fetchProducts();
        startManagingCursor(c);

   
       
        SimpleCursorAdapter adapter=new SimpleCursorAdapter( //semplice adapter per i cursor
                        this,
                        R.layout.product, //il layout di ogni riga/prodotto
                        c,
                        new String[]{MyDatabase.ProductsMetaData.PRODUCT_IDAR_KEY,MyDatabase.ProductsMetaData.PRODUCT_NOMEAR_KEY,MyDatabase.ProductsMetaData.PRODUCT_URIAR_KEY},//questi colonne
                        new int[]{R.id.Idar,R.id.Nomear,R.id.Qtaar});//in queste views
     
       
        productsLv.setAdapter(adapter); //la listview ha questo adapter
       
       
        db2.close();
       
       
       

        getWindow().setFormat(PixelFormat.RGBA_8888);   //visto che usiamo i gradient, usiamo questo trick (vedi snippet forum)
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);  
       
        productsLv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[]{Color.RED,Color.parseColor("#f2bf26")}));
        productsTv.setBackgroundDrawable(new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, new int[]{Color.RED,Color.parseColor("#f2bf26")}));
        //definizione ed uso di gradient in modo programmatico
       
       
        //animazioni in modo programmatico (vedi snippet forum)
        Animation a1 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, 1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
        a1.setDuration(1000);
        a1.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator));
        productsLv.startAnimation(a1);
        //entra dal sotto
       
       
        Animation a2 = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_SELF, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_SELF, 0.0f);
        a2.setDuration(1000);
        a2.setInterpolator(AnimationUtils.loadInterpolator(this, android.R.anim.decelerate_interpolator));
        productsTv.startAnimation(a2);
        //entra dal sopra
       
       
    }
}

MyDatabase.java
Codice (Java): [Seleziona]
package ch.egsolutions.databasetutorial;

import java.util.ArrayList;

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

public class MyDatabase {  
       
        SQLiteDatabase mDb;
        DbHelper mDbHelper;
        Context mContext;
        private static final String DB_NAME="lista_spesa2";//nome del db
        private static final int DB_VERSION=1; //numero di versione del nostro db
       
        public MyDatabase(Context ctx){
                mContext=ctx;
                mDbHelper=new DbHelper(ctx, DB_NAME, null, DB_VERSION);   //quando istanziamo questa classe, istanziamo anche l'helper (vedi sotto)    
        }
       
        public void open(){  //il database su cui agiamo è leggibile/scrivibile
                mDb=mDbHelper.getWritableDatabase();
               
        }
       
       
       
       
        public void close(){ //chiudiamo il database su cui agiamo
                mDb.close();
        }
       
       
        //i seguenti 2 metodi servono per la lettura/scrittura del db. aggiungete e modificate a discrezione
       
        public void insertProduct(String IDAR, String NOMEAR, String URIAR){ //metodo per inserire i dati
                ContentValues cv=new ContentValues();
                cv.put(ProductsMetaData.PRODUCT_IDAR_KEY, IDAR);
                cv.put(ProductsMetaData.PRODUCT_NOMEAR_KEY, NOMEAR);
                cv.put(ProductsMetaData.PRODUCT_URIAR_KEY, URIAR);
                //cv.put(ProductsMetaData.PRODUCT_PRESO_KEY, CHECK);
                mDb.insert(ProductsMetaData.PRODUCTS_TABLE, null, cv);
        }
       
       
        //Metodo per cancellare tutte le righe della tabella products
       
         public void deleteAll(){
                mDb.delete("products", null, null);
        }

       
         //Metodo per salvare in un ArrayList (results) tutto il contenuto UTILE del database
         //che andrà poi serializzato in XML
         public ArrayList<MyArt> selectAll() {
                 
                 
         try {
                 ArrayList<MyArt> results = new ArrayList<MyArt>();
                 Cursor c = mDb.rawQuery("select * from products", null);
                 if (c.getCount() > 0) {
                         c.moveToFirst();
                       
                                 do {
                                         MyArt newArt=new MyArt();
                                 
                                         newArt.setId(c.getString(c.getColumnIndex("IDAR")));
                                         newArt.setArti(c.getString(c.getColumnIndex("NOMEAR")));
                                         newArt.setUri(c.getString(c.getColumnIndex("URIAR")));
                                 
                                         results.add(newArt);
                                 
                                 } while(c.moveToNext());                            
                 }
                 return results;
         } finally {
                // if (mDb != null)
                         //mDb.close();
         }
 }
         
         
        //metodo per fare la query di tutti i dati
        public Cursor fetchProducts(){
                return mDb.query(ProductsMetaData.PRODUCTS_TABLE, null,null,null,null,null,null);              
        }

        // i metadati della tabella, accessibili ovunque
        static class ProductsMetaData {  
                static final String PRODUCTS_TABLE = "products";
                static final String ID = "_id";
                static final String PRODUCT_IDAR_KEY = "IDAR";
                static final String PRODUCT_NOMEAR_KEY = "NOMEAR";
                static final String PRODUCT_URIAR_KEY = "URIAR";
                //static final Boolean PRODUCT_PRESO_KEY = CHECK;
               
        }

       
        //codice sql di creazione della tabella
        private static final String PRODUCTS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "  
                        + ProductsMetaData.PRODUCTS_TABLE + " ("
                        + ProductsMetaData.ID+ " integer primary key autoincrement, "
                        + ProductsMetaData.PRODUCT_IDAR_KEY + " text not null, "
                        + ProductsMetaData.PRODUCT_NOMEAR_KEY + " text not null, "
                        + ProductsMetaData.PRODUCT_URIAR_KEY + " text not null);";
                //+ ProductsMetaData.PRODUCT_PRESO_KEY + "  boolean);";

       
        //classe che ci aiuta nella creazione del db
        private class DbHelper extends SQLiteOpenHelper {

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

               
                //solo quando il db viene creato, creiamo la tabella
                @Override
                public void onCreate(SQLiteDatabase _db) {
                        _db.execSQL(PRODUCTS_TABLE_CREATE);
                       
                }

               
                //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app,
                //il db cambia numero di versione
                @Override
                public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
                       
                }
        }
}

MyArt.java
Codice (Java): [Seleziona]
package ch.egsolutions.databasetutorial;

public class MyArt {
        private String ARTICOLO;
        private String URI;
        private String ID_ARTICOLO;
        private boolean NONCIBO;
        private boolean CHANGED;
       
        public String getId() {
                return ID_ARTICOLO;
        }

        public void setId(String ID_ARTICOLO) {
                this.ID_ARTICOLO = ID_ARTICOLO;
        }

        public String getArti() {
                return ARTICOLO;
        }

        public void setArti(String ARTICOLO) {
                this.ARTICOLO = ARTICOLO;
        }

        public String getUri() {
                return URI;
        }

        public void setUri(String URI) {
                this.URI = URI;
        }
       
        public void setNonCibo(boolean NONCIBO)

        {
                this.NONCIBO = NONCIBO;
        }
       
        public boolean getNonCibo ()
        {
                return NONCIBO;
        }
       
        public void setChanged(boolean CHANGED)

        {
                this.CHANGED = CHANGED;
        }
       
        public boolean getChanged ()
        {
                return CHANGED;
        }
       
       
        @Override
        public String toString() {
                return "[ID=" + ID_ARTICOLO  + " AR=" + ARTICOLO + " QTA=" + URI + "]" + "\n";
        }
}

In sostanza io faccio il parsing di un file xml (articoli.xml) e li inserisco nel db.
L'applicazione funziona ma nel LOGCAT mi compaiono questi due errori che non riesco a comprendere:

10-30 09:04:24.532: ERROR/Database(1365): Error inserting NOMEAR=null URIAR=null IDAR=null
10-30 09:04:24.532: ERROR/Database(1365): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
10-30 09:04:24.532: ERROR/Database(1365):     at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
10-30 09:04:24.532: ERROR/Database(1365):     at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55)


e poi
10-30 09:04:25.192: ERROR/Cursor(1365): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/ch.egsolutions.databasetutorial/databases/lista_spesa2, table = null, query = select * from products
10-30 09:04:25.192: ERROR/Cursor(1365): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
10-30 09:04:25.192: ERROR/Cursor(1365):     at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)

Vi ringrazio per l'aiuto!
Ciao!


Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #9 il: 01 Novembre 2010, 21:13:04 CET »
0
10-30 09:04:25.192: ERROR/Cursor(1365): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/ch.egsolutions.databasetutorial/databases/lista_spesa2, table = null, query = select * from products
10-30 09:04:25.192: ERROR/Cursor(1365): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
10-30 09:04:25.192: ERROR/Cursor(1365):     at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)

Risolto con:

Codice (Java): [Seleziona]
Cursor c=db2.fetchProducts2();
        startManagingCursor(c);
        MyAdapter adapter = new MyAdapter(this, c);
        productsLv.setAdapter(adapter);

Mettere sempre il  startManagingCursor(YourCursor); almeno android non rompe... :-)

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:Creazione e gestione database
« Risposta #10 il: 01 Novembre 2010, 21:25:28 CET »
0
Quando ho visto il logcat stavo per scriverti di usare ma startManagingCursor() mi sembrava che tu già lo facessi:
Codice (Java): [Seleziona]
        // query che ci restituisce tutti i prodotti in lista e li passa ad un Cursor
        Cursor c=db2.fetchProducts();
        startManagingCursor(c);
È stata trovata una soluzione al tuo problema?
Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;).
E se hai aperto tu il thread marcalo come risolto cliccando !

Offline Albe85

  • Utente junior
  • **
  • Post: 102
  • Respect: +1
    • Mostra profilo
Re:Creazione e gestione database
« Risposta #11 il: 01 Novembre 2010, 22:01:31 CET »
0
Si già lo facevo ma non mi ero accorto poi che quando creavo i metodi che mi ritornavano un Cursor lo dovevo "risettare":

Codice (Java): [Seleziona]
//metodo per fare la query di tutti i dati della tabella articoli
        public Cursor fetchProducts(){
                return mDb.query(ProductsMetaDataArt.PRODUCTS_TABLE, null,null,null,null,null,null);
        }

        //metodo per fare la query di tutti i dati della tabella articolo e della tabella logspesadb dove prodotti.IDARA=logspesadb.IDARL
        public Cursor fetchProducts2(){
                //return mDb.rawQuery("SELECT prodotti.NOMEAR, prodotti.URIIMG, logspesadb.QUANTITA FROM prodotti,logspesadb WHERE prodotti.IDARA=logspesadb.IDARL", null);
                return mDb.rawQuery("SELECT prodotti._id,logspesadb._id2,prodotti.NOMEAR,prodotti.URIIMG,logspesadb.QUANTITA FROM prodotti,logspesadb WHERE prodotti.IDARA=logspesadb.IDARL", null);
               
        }
       
        //metodo per fare la query di tutti i dati della tabella logspesadb
        public Cursor fetchLog(){
                return mDb.query(ProductsMetaDataLog.LOGSPES_TABLE, null,null,null,null,null,null);    
        }

e li andavo a utilizzare non andavo a settare lo startManagingCursor(CURSOR); come nei seguenti casi:
Codice (Java): [Seleziona]
Cursor e = db2.fetchProducts();
        startManagingCursor(e);
        if(e.getCount()==0){//inserimento dati tabella prodotti
                for(int h=1; h<AR2.size();h++)
                {
                          db2.insertProduct(AR2.get(h).getId(),AR2.get(h).getArti(),AR2.get(h).getNonCibo(),AR2.get(h).getUri(),AR2.get(h).getChanged());        
                }
        }
       
       
        db2.deleteLogspesadb();
        Cursor f = db2.fetchLog();
        startManagingCursor(f);
        if(f.getCount()==0){//inserimento dati tabella prodotti
                for(int o=1; o<LS.size();o++)
                {
                          db2.insertLogSpesa(LS.get(o).getIDArticolo(),LS.get(o).getQta());
                }
        }        

grazie 1000 lo stesso...non me ne ero accorto io...