CERCA
PER MODELLO
FullScreen Chatbox! :)

Utente del giorno: gianpassa con ben 2 Thanks ricevuti nelle ultime 24 ore
Utente della settimana: 9mm con ben 9 Thanks ricevuti negli ultimi sette giorni
Utente del mese: 9mm con ben 34 Thanks ricevuti nell'ultimo mese

Visualizzazione dei risultati da 1 a 9 su 9
Discussione:

[db]come effettuare una quesry su string

Se questa discussione ti è stata utile, ti preghiamo di lasciare un messaggio di feedback in modo che possa essere preziosa in futuro anche per altri utenti come te!
  1. #1
    Baby Droid


    Registrato dal
    Jul 2009
    Messaggi
    20

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    [db]come effettuare una quesry su string

    come da oggetto vorrei poter effettuare una query su di un database,il seguente database ha una tabella composta in questo odo:
    - _id - integer
    - lp - string
    - body - string
    - author - string
    questo è il codice della funzione che ho fatto:
    codice:
       //---retrieves a particular body---
        public Cursor getTitlefromlc(String lp) throws SQLException 
        {
            Cursor mCursor =
                    db.query(true, DATABASE_TABLE, new String[] {
                    		KEY_ROWID,
                    		KEY_LP, 
                    		KEY_BODY,
                    		KEY_AUTHOR
                    		}, 
                    		KEY_LP + "= " + lp, 
                    		null,
                    		null, 
                    		null, 
                    		null, 
                    		null);
            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
        }
    la funzione dovrebbe ritornarmi un cursor sulla posizione in cui nella collonna LP trova una stringa identica a lp passato come paramentro...ma mi crasha ogni volta che uso questa funzione,credo che il problema sia nel uso della funzione query visto che di db e simili non ho molta esperienza.avete qualche idea o suggerrimento?mi andrebbe bene anche un link per capire come interaggire con un database.
    Bye.

  2.  
  3. #2
    Senior Droid L'avatar di Cymon


    Registrato dal
    Jul 2010
    Messaggi
    419

    Ringraziamenti
    7
    Ringraziato 43 volte in 42 Posts
    Predefinito

    Mmmmh, immagino stiamo parlando di un android.database.sqlite.SQLiteDatabase, giusto?

    C'è qualcosa che non capisco... la tua tabella di database si chiama DATABASE_NAME e le colonne hanno nomi che cominciano con KEY_?
    L'eccezione che ti da qual è?
    Se ti sei scritto la query in forma SQL prima di darla al codice java ricorda che puoi sempre prima testarla tramite sqlite nell'emulatore senza passare dalla app...
    La mia katana: Slackware 13.1
    La mia wakizashi: Acer A1 Liquid con Android 2.1 Eclair
    Il mio sito: Follow the rabbit (con la sua App )

  4. #3
    Baby Droid


    Registrato dal
    Jul 2009
    Messaggi
    20

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da Cymon Visualizza il messaggio
    Mmmmh, immagino stiamo parlando di un android.database.sqlite.SQLiteDatabase, giusto?
    intanto grazie per la risposta si esatto è un SQLiteDatabase
    Quote Originariamente inviato da Cymon
    C'è qualcosa che non capisco... la tua tabella di database si chiama DATABASE_NAME e le colonne hanno nomi che cominciano con KEY_?
    L'eccezione che ti da qual è?
    Se ti sei scritto la query in forma SQL prima di darla al codice java ricorda che puoi sempre prima testarla tramite sqlite nell'emulatore senza passare dalla app...
    per farti capire meglio ti incollo sotto la classe che uso per gestire il db:
    codice:
    package org.test_db;
    
    import android.content.ContentValues;
    import android.content.Context;
    import android.database.Cursor;
    import android.database.SQLException;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    
    public class DBadapter 
    {
        public static final String KEY_ROWID = "_id";
        public static final String KEY_LP = "languageprogram";
        public static final String KEY_BODY = "body";
        public static final String KEY_AUTHOR = "author";    
        private static final String TAG = "DBAdapter";
        
        private static final String DATABASE_NAME = "helloworld_db";
        private static final String DATABASE_TABLE = "record_type";
        private static final int DATABASE_VERSION = 1;
    
        private static final String DATABASE_CREATE =
            "create table record_type (_id integer primary key autoincrement, "
            + "languageprogram text not null, body text not null, " 
            + "author text not null);";
            
        private final Context context; 
        
        private DatabaseHelper DBHelper;
        private SQLiteDatabase db;
    
        public DBadapter(Context ctx) 
        {
            this.context = ctx;
            DBHelper = new DatabaseHelper(context);
        }
            
        private static class DatabaseHelper extends SQLiteOpenHelper 
        {
            DatabaseHelper(Context context) 
            {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) 
            {
                db.execSQL(DATABASE_CREATE);
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, 
            int newVersion) 
            {
                Log.w(TAG, "Upgrading database from version " + oldVersion 
                        + " to "
                        + newVersion + ", which will destroy all old data");
                db.execSQL("DROP TABLE IF EXISTS bodys");
                onCreate(db);
            }
        }    
        
        //---opens the database---
        public DBadapter open() throws SQLException 
        {
            db = DBHelper.getWritableDatabase();
            return this;
        }
    
        //---closes the database---    
        public void close() 
        {
            DBHelper.close();
        }
        
        //---insert a body into the database---
        public long insertTitle(String languageprogram, String body, String author) 
        {
            ContentValues initialValues = new ContentValues();
            initialValues.put(KEY_LP, languageprogram);
            initialValues.put(KEY_BODY, body);
            initialValues.put(KEY_AUTHOR, author);
            return db.insert(DATABASE_TABLE, null, initialValues);
        }
    
        //---deletes a particular body---
        public boolean deleteTitle(long rowId) 
        {
            return db.delete(DATABASE_TABLE, KEY_ROWID + 
            		"=" + rowId, null) > 0;
        }
    
        //---retrieves all the bodys---
        public Cursor getAllTitles() 
        {
            return db.query(DATABASE_TABLE, new String[] {
            		KEY_ROWID, 
            		KEY_LP,
            		KEY_BODY,
                    KEY_AUTHOR}, 
                    null, 
                    null, 
                    null, 
                    null, 
                    null);
        }
    
        //---retrieves a particular body---
        public Cursor getTitle(long rowId) throws SQLException 
        {
            Cursor mCursor =
                    db.query(true, DATABASE_TABLE, new String[] {
                    		KEY_ROWID,
                    		KEY_LP, 
                    		KEY_BODY,
                    		KEY_AUTHOR
                    		}, 
                    		KEY_ROWID + "=" + rowId, 
                    		null,
                    		null, 
                    		null, 
                    		null, 
                    		null);
            
            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
        }
        
        //---retrieves a particular body---
        public Cursor getTitlefromlc(String lp) throws SQLException 
        {
            Cursor mCursor =
                    db.query(true, DATABASE_TABLE, new String[] {
                    		KEY_ROWID,
                    		KEY_LP, 
                    		KEY_BODY,
                    		KEY_AUTHOR
                    		}, 
                    		"WHERE " + KEY_LP + " = " + "'" + lp + "'", 
                    		null,
                    		null, 
                    		null, 
                    		null, 
                    		null);
            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
        }
    
        //---updates a body---
        public boolean updateTitle(long rowId, String languageprogram, 
        String body, String author) 
        {
            ContentValues args = new ContentValues();
            args.put(KEY_LP, languageprogram);
            args.put(KEY_BODY, body);
            args.put(KEY_AUTHOR, author);
            return db.update(DATABASE_TABLE, args, 
                             KEY_ROWID + "=" + rowId, null) > 0;
        }
    }
    è una classe di esempio che ho trovato in rete e sto modificando per studiarmi android;comunque ho provato a lanciare una query direttamente al db e funziona,la query è questa:
    codice:
    select * from record_type where languageprogram='c';
    infatti se la eseguo ottengo il giusto risultato:
    codice:
    sqlite> select * from record_type where languageprogram='c';
    1|c|#include <stdio.h>
    
    int main(){
    	printf("hello, world");
    	return 0;
    }|iacopodeenosee
    sqlite>
    come posso modificare la query in java per ottenere lo stesso risultato?

  5. #4
    Senior Droid L'avatar di Cymon


    Registrato dal
    Jul 2010
    Messaggi
    419

    Ringraziamenti
    7
    Ringraziato 43 volte in 42 Posts
    Predefinito

    Quote Originariamente inviato da IacopoDeeNosee Visualizza il messaggio
    come posso modificare la query in java per ottenere lo stesso risultato?
    A un primo sguardo mi sembra tutto corretto... l'unica imprecisione che mi sento di segnalare è che nella query di create sarebbe il caso che usassi le costanti definite precedentemente così da tenere sempre tutto allineato. In realtà però mi pare che è stato tutto creato col nome corretto quindi il problema non può essere lì...

    L'unica cosa che mi viene da pensare è che ci sono problemi quando "la usi". Come è la classe chiamante?
    E che errore ricevi quando provi a lanciare la query?
    La mia katana: Slackware 13.1
    La mia wakizashi: Acer A1 Liquid con Android 2.1 Eclair
    Il mio sito: Follow the rabbit (con la sua App )

  6. #5
    Baby Droid


    Registrato dal
    Jul 2009
    Messaggi
    20

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da Cymon Visualizza il messaggio
    L'unica cosa che mi viene da pensare è che ci sono problemi quando "la usi". Come è la classe chiamante?
    E che errore ricevi quando provi a lanciare la query?
    faccio prima a passarti tutto il progetto di eclipse del test,lo trovi qui:
    RapidShare Easy Filehosting
    l'errore lo ottengo a run-time ed è un errore generico,la chimata la faccio dall'activity principale in questo modo:
    codice:
    ...
            	Spinner spinnerchoice = (Spinner) findViewById(R.id.spinner_choice);
            		
      		  String pkg=getPackageName();  			
            	
            	      // creo passaggio alla seconda activity
            	      Intent i = new Intent(test_db.this, output.class);
            	      
            	      String strlc = spinnerchoice.getSelectedItem().toString();
            	      
            	      i.putExtra(pkg+".strlc", strlc);
            	      
            	      //estrai dal db le ultime due stringhe
            	        DBadapter db1 = new DBadapter(test_db.this);
            	        //---add 2 titles---
            	        db1.open();   
            	        Cursor searchcursor=db1.getTitlefromlc(strlc);
            	        
            	        //allego le due stringhe pe rl aseconda activity
                	      i.putExtra(pkg+".strbody",searchcursor.getString(2));
                	      i.putExtra(pkg+".strauthor", searchcursor.getString(3));
            	        
            	        db1.close();
    
            	      //avvio seconda activity
            	      test_db.this.startActivity(i);
    ...

  7. #6
    Senior Droid L'avatar di Cymon


    Registrato dal
    Jul 2010
    Messaggi
    419

    Ringraziamenti
    7
    Ringraziato 43 volte in 42 Posts
    Predefinito

    Quote Originariamente inviato da IacopoDeeNosee Visualizza il messaggio
    l'errore lo ottengo a run-time ed è un errore generico,la chimata la faccio
    Eeeh vabbè, non esiste errore generico che non meriti almeno la dignità di una sbirciatina al log.
    Se vuoi avere dettagli sul perché scoppia tutto vai da prompt dei comandi/shell sotto la directory tools del SDK e lancia adb logcat*
    A questo punto il sistema sbrodolerà copiose righe e sicuramente anche un'eccezione Java. Sarebbe bello analizzare cosa dice quella...







    *C'è sicuramente un modo per fare uguale uguale da Eclipse, ma non lo so
    La mia katana: Slackware 13.1
    La mia wakizashi: Acer A1 Liquid con Android 2.1 Eclair
    Il mio sito: Follow the rabbit (con la sua App )

  8. #7
    Baby Droid


    Registrato dal
    Jul 2009
    Messaggi
    20

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da Cymon Visualizza il messaggio
    Eeeh vabbè, non esiste errore generico che non meriti almeno la dignità di una sbirciatina al log.
    spulciando il log ho trovato questo warning che riguarda un errore nel acesso al db:
    codice:
    08-15 18:53:29.443: INFO/Database(471): sqlite returned: error code = 1, msg = no such column: java
    e poi questi errori alla chiusura forzata dell app:
    codice:
    08-15 18:57:30.483: ERROR/Cursor(496): Finalizing a Cursor that has not been deactivated or closed. database = /data/data/org.test_db/databases/helloworld_db, table = record_type, query = SELECT _id, languageprogram, body, author FROM record_type
    08-15 18:57:30.483: ERROR/Cursor(496): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.database.sqlite.SQLiteCursor.<init>(SQLiteCursor.java:210)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:53)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264)
    08-15 18:57:30.483: ERROR/Cursor(496):     at org.test_db.DBadapter.getAllTitles(DBadapter.java:97)
    08-15 18:57:30.483: ERROR/Cursor(496):     at org.test_db.test_db.onCreate(test_db.java:59)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.os.Handler.dispatchMessage(Handler.java:99)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.os.Looper.loop(Looper.java:123)
    08-15 18:57:30.483: ERROR/Cursor(496):     at android.app.ActivityThread.main(ActivityThread.java:4627)
    08-15 18:57:30.483: ERROR/Cursor(496):     at java.lang.reflect.Method.invokeNative(Native Method)
    08-15 18:57:30.483: ERROR/Cursor(496):     at java.lang.reflect.Method.invoke(Method.java:521)
    08-15 18:57:30.483: ERROR/Cursor(496):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
    08-15 18:57:30.483: ERROR/Cursor(496):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
    08-15 18:57:30.483: ERROR/Cursor(496):     at dalvik.system.NativeStart.main(Native Method)
    e l'unica cosa che ho notato è che la query che c'è nel log non è quella che volevo io
    SELECT _id, languageprogram, body, author FROM record_type

    mentre a me serve :
    codice:
    "select * from record_type where languageprogram=" + lp
    credo che l'errore sia proprio il modo in cui eseguo la query.

  9. #8
    Senior Droid L'avatar di Cymon


    Registrato dal
    Jul 2010
    Messaggi
    419

    Ringraziamenti
    7
    Ringraziato 43 volte in 42 Posts
    Predefinito

    Quote Originariamente inviato da IacopoDeeNosee Visualizza il messaggio
    e l'unica cosa che ho notato è che la query che c'è nel log non è quella che volevo io
    SELECT _id, languageprogram, body, author FROM record_type

    mentre a me serve :
    codice:
    "select * from record_type where languageprogram=" + lp
    credo che l'errore sia proprio il modo in cui eseguo la query.
    MMmmmh, sicuro che quella riga di log non faccia riferimento a questa porzione di codice:



    che è precedente a quella che stai analizzando ma che mi sembra riguardi proprio la query che ti da problemi nel log...
    La mia katana: Slackware 13.1
    La mia wakizashi: Acer A1 Liquid con Android 2.1 Eclair
    Il mio sito: Follow the rabbit (con la sua App )

  10. #9
    Baby Droid


    Registrato dal
    Jul 2009
    Messaggi
    20

    Ringraziamenti
    1
    Ringraziato 0 volte in 0 Posts
    Predefinito

    Quote Originariamente inviato da Cymon Visualizza il messaggio
    ...
    che è precedente a quella che stai analizzando ma che mi sembra riguardi proprio la query che ti da problemi nel log...
    si in effetti sembrerebbbe che riguardi quella query,ma quando viene lanciata all'avvio dell'app non da alcun problema,comuqnue sono riuscito a risolvere,a forza di sbatterci la testa,avevo sbagliato la query dimenticando di racchiudere la variabile da confrontare nel database con gli apici [']
    ecco il codice funzionante:
    codice:
        public Cursor getTitlefromlc(String lp) throws SQLException 
        {
    
            Cursor mCursor = db.query(DATABASE_TABLE, new String[] {                		
            		KEY_ROWID,
            		KEY_LP, 
            		KEY_BODY,
            		KEY_AUTHOR}, 
                    KEY_LP + " = " + "'"+ lp +"'", null, null, null, null);
    
            if (mCursor != null) {
                mCursor.moveToFirst();
            }
            return mCursor;
        }
    grazie della disponibilità
    Bye.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire risposte
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Torna su
Privacy Policy