Autore Topic: problema nela gestione db  (Letto 1065 volte)

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 127
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
problema nela gestione db
« il: 25 Settembre 2010, 12:33:53 CEST »
0
ho fatto un programma di test che copia un db già esistente inserito nella cartella assets del progetto e per poi usarlo,il programma funziona sull'emulatore ma se lo carico nel telefono mi crasha:pensavo fosse un problema di permessi ed ho fatto diverse prove abilitando tutti i permessi che riguardano la scrittura sui file ma non è servito  o_O
mi potete illuminare?
qui trovate l'intero progetto di prova:
RapidShare: 1-CLICK Web hosting - Easy Filehosting
qui invece il codice dell'activity
Codice (Java): [Seleziona]
package org.test_copydb;

import java.io.IOException;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.*;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Toast;
import android.widget.Spinner;


public class test_copydb extends Activity {
   

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
       
        setContentView(R.layout.main);
   
        DBadapter db = new DBadapter(this);
 
        try {
 
            db.createDataBase();
 
     } catch (IOException ioe) {
 
         throw new Error("Unable to create database");
 
     }
 
     db.openDataBase();

 
        //---get all titles ad populated spinner---
        ArrayList<String> arraylp = new ArrayList<String>();

        db.openDataBase();
        Cursor c = db.getAllTitles();
        if (c.moveToFirst())
        {
            do {          
                //show the lp
                DisplayTitle(c);
                //add the lp into the array spinner
                arraylp.add(c.getString(1));
               
            } while (c.moveToNext());
        }
        db.close();

        Spinner spinnerchoice = (Spinner) findViewById(R.id.spinner_choice);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, arraylp);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerchoice.setAdapter(adapter);
       
       
       
        Button button = (Button) findViewById(R.id.button_choice);
        button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
                   
                    Spinner spinnerchoice = (Spinner) findViewById(R.id.spinner_choice);
               
                        String pkg=getPackageName();              
           
                  // creo passaggio di dati alla seconda activity
                  Intent i = new Intent(test_copydb.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_copydb.this);
                    //---add 2 titles---
                    db1.openDataBase();  
                    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_copydb.this.startActivity(i);

                  }
        });
    }
   
    public void DisplayTitle(Cursor c)
    {
        Toast.makeText(this,
                "id: " + c.getString(0) + "\n" +
                "Language program:\n" + c.getString(1) + "\n" +
                "body:\n" + c.getString(2) + "\n" +
                "author:\n" + c.getString(3),
                Toast.LENGTH_LONG).show();        
    }

}
codice dbadapter
Codice (Java): [Seleziona]
package org.test_copydb;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.*;
import android.util.Log;

public class DBadapter extends SQLiteOpenHelper {
     
    private static final String DATABASE_NAME = "helloworld.db";
    private static String DATABASE_PATH = "";
    private static final String DATABASE_TABLE = "record_type";
    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 Integer DB_VERSION = 1;
   
    private final Context context;
    private SQLiteDatabase db;
 
    public DBadapter(Context context) {
        super(context, DATABASE_NAME, null, DB_VERSION);
        this.context = context;
    }
 
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
    }
 
    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
    }
 
    public void openDataBase() throws SQLException{
       try {

               DATABASE_PATH = "/data/data/"+ context.getPackageName() +"/databases/";
               String myPath = DATABASE_PATH + DATABASE_NAME;
              db = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
       } catch (Exception e) {
            e.printStackTrace();
       }
    }
   
    public void createDataBase() throws IOException{
         
        boolean dbExist = checkDataBase();
 
        if(dbExist){
            //do nothing - database already exist
        }else{
            this.getReadableDatabase();
 
            try {
 
                copyDataBase();
 
            } catch (IOException e) {
 
                throw new Error("Error copying database");
 
            }
        }
 
    }
   
    private void copyDataBase() throws IOException{
         
        //Open your local db as the input stream
        InputStream myInput = context.getAssets().open(DATABASE_NAME);
 
        DATABASE_PATH = "/data/data/"+ context.getPackageName() +"/databases/";
        // Path to the just created empty db
        String outFileName = DATABASE_PATH + DATABASE_NAME;
 
        // if the path doesn't exist first, create it
        File f = new File(outFileName);
        if (!f.exists()){
                f.mkdir();
                f.createNewFile();
        }
       
        //Open the empty db as the output stream
        OutputStream myOutput = new FileOutputStream(outFileName);
 
        //transfer bytes from the inputfile to the outputfile
        byte[] buffer = new byte[1024];
        int length;
        while ((length = myInput.read(buffer))>0){
            myOutput.write(buffer, 0, length);
        }
 
        //Close the streams
        myOutput.flush();
        myOutput.close();
        myInput.close();
 
    }
 


    private boolean checkDataBase(){
         
        SQLiteDatabase checkDB = null;
 
        try{
            DATABASE_PATH = "/data/data/"+ context.getPackageName() +"/databases/";
            String myPath = DATABASE_PATH + DATABASE_NAME;
            checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE);
 
        }catch(SQLiteException e){
 
            //database does't exist yet.
 
        }
 
        if(checkDB != null){
 
            checkDB.close();
 
        }
 
        return checkDB != null ? true : false;
    }
   
    @Override
    public synchronized void close() {
 
            if(db != null)
                db.close();
 
            super.close();
 
    }

   
    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(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 a chi ci dà un occhiata,o lo testa sul suo telefono ;) Bye.

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:problema nela gestione db
« Risposta #1 il: 25 Settembre 2010, 12:35:49 CEST »
0
Il logcat che dice?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 127
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:problema nela gestione db
« Risposta #2 il: 25 Settembre 2010, 13:56:37 CEST »
0
quello dell'emulatore non lo posto nemmeno visto che non lamenta nessun problema,invece nel telefono sputa fuori questo:
Codice: [Seleziona]
I/ActivityManager(  144): Start proc com.google.android.voicesearch for broadcast com.google.android.voicesearch/.logging.LoggingReceiver: pid=14788 uid=10034 gids={3003}
I/ActivityThread(14788): Publishing provider com.google.android.voicesearch.VoiceSearchResultProvider: com.google.android.voicesearch.VoiceSearchResultProvider
I/ActivityManager(  144): Process com.google.android.voicesearch (pid 14788) has died.
I/ActivityManager(  144): Low Memory: No more background processes.
I/ActivityManager(  144): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=org.test_copydb/.test_copydb bnds=[156,314][226,402] }
I/ActivityManager(  144): Start proc org.test_copydb for activity org.test_copydb/.test_copydb: pid=14805 uid=10079 gids={1015}
I/Database(14805): sqlite returned: error code = 14, msg = cannot open file at source line 25467
E/Database(14805): sqlite3_open_v2("/data/data/org.test_copydb/databases/helloworld.db", &handle, 2, NULL) failed
D/AndroidRuntime(14805): Shutting down VM
W/dalvikvm(14805): threadid=1: thread exiting with uncaught exception (group=0x400207f8)
E/AndroidRuntime(14805): FATAL EXCEPTION: main
E/AndroidRuntime(14805): java.lang.Error: Error copying database
E/AndroidRuntime(14805):     at org.test_copydb.DBadapter.createDataBase(DBadapter.java:69)
E/AndroidRuntime(14805):     at org.test_copydb.test_copydb.onCreate(test_copydb.java:40)
E/AndroidRuntime(14805):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(14805):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(14805):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(14805):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(14805):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(14805):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(14805):     at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(14805):     at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(14805):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(14805):     at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(14805):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(14805):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(14805):     at dalvik.system.NativeStart.main(Native Method)
W/ActivityManager(  144):   Force finishing activity org.test_copydb/.test_copydb
W/ActivityManager(  144): Activity pause timeout for HistoryRecord{44357050 org.test_copydb/.test_copydb}
I/Process (14805): Sending signal. PID: 14805 SIG: 9
I/ActivityManager(  144): Process org.test_copydb (pid 14805) has died.
W/InputManagerService(  144): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@44275340
I/ActivityManager(  144): Start proc com.google.android.voicesearch for broadcast com.google.android.voicesearch/.logging.LoggingReceiver: pid=14816 uid=10034 gids={3003}
I/ActivityThread(14816): Publishing provider com.google.android.voicesearch.VoiceSearchResultProvider: com.google.android.voicesearch.VoiceSearchResultProvider
I/ActivityManager(  144): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=org.jtb.alogcat/.LogActivity bnds=[3,238][77,317] }
D/alogcat (14741): stopping ...
da quanto ho capito non riesce ad aprire il db copiato nella cartella /data/data/org.test_copydb/databases/?ma se è questo il problema non dovrebbe funzionare nemmeno sull'emulatore...cosa mi sfugge?

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:problema nela gestione db
« Risposta #3 il: 25 Settembre 2010, 13:57:13 CEST »
0
Quoto, come riportato nei suggerimenti visualizzati alla creazione di un nuovo thread, si deve sempre postare il logcat in questi casi.

Comunque prova a dare uno sguardo ai sorgenti di questa app: AlmanacSQLiteDatabaseAdapter.java
« Ultima modifica: 25 Settembre 2010, 14:16:36 CEST da JD »
È 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 IacopoDeeNosee

  • Utente junior
  • **
  • Post: 127
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:problema nela gestione db
« Risposta #4 il: 25 Settembre 2010, 16:04:07 CEST »
0
non ne vengo fuori  :-( ,ho dato un occhio al tuo codice per gestire il db,perciò l'ho inserito nel progetto di test  adeguandolo al resto...
se lancio l'app nell'emulatore va via liscia e fà il suo sporco lavoro,ma se la lancio nel telefono non funzia,ecco il logcat:
Codice: [Seleziona]
I/ActivityManager(  144): Start proc org.test_copydb for activity org.test_copydb/.test_copydb: pid=16906 uid=10079 gids={1015}
I/DBadapter(16906): Trying to conntect to : /data/data/org.test_copydb/databases/helloworld.db
I/Database(16906): sqlite returned: error code = 14, msg = cannot open file at source line 25467
E/Database(16906): sqlite3_open_v2("/data/data/org.test_copydb/databases/helloworld.db", &handle, 1, NULL) failed
I/DBadapter(16906): Database helloworld.db does not exists!
I/DBadapter(16906): Check if create dir : /data/data/org.test_copydb/databases/
I/DBadapter(16906): Trying to copy local DB to : /data/data/org.test_copydb/databases/helloworld.db
I/DBadapter(16906): DB (helloworld.db) copied!
I/DBadapter(16906): Try to create instance of database (helloworld.db)
I/DBadapter(16906): Create or Open database : helloworld.db
I/ActivityManager(  144): Process com.google.android.voicesearch (pid 16886) has died.
I/ActivityManager(  144): Low Memory: No more background processes.
I/DBadapter(16906): instance of database (helloworld.db) created !
I/Database(16906): sqlite returned: error code = 1, msg = no such table: record_type
D/AndroidRuntime(16906): Shutting down VM
W/dalvikvm(16906): threadid=1: thread exiting with uncaught exception (group=0x400207f8)
E/AndroidRuntime(16906): FATAL EXCEPTION: main
E/AndroidRuntime(16906): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.test_copydb/org.test_copydb.test_copydb}: android.database.sqlite.SQLiteException: no such table: record_type: , while compiling: SELECT _id, languageprogram, body, author FROM record_type
E/AndroidRuntime(16906):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
E/AndroidRuntime(16906):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
E/AndroidRuntime(16906):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
E/AndroidRuntime(16906):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
E/AndroidRuntime(16906):     at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(16906):     at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(16906):     at android.app.ActivityThread.main(ActivityThread.java:4627)
E/AndroidRuntime(16906):     at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(16906):     at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(16906):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
E/AndroidRuntime(16906):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
E/AndroidRuntime(16906):     at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(16906): Caused by: android.database.sqlite.SQLiteException: no such table: record_type: , while compiling: SELECT _id, languageprogram, body, author FROM record_type
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:64)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:80)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:46)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1229)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1184)
E/AndroidRuntime(16906):     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1264)
E/AndroidRuntime(16906):     at org.test_copydb.test_copydb.getAllTitles(test_copydb.java:124)
E/AndroidRuntime(16906):     at org.test_copydb.test_copydb.onCreate(test_copydb.java:54)
E/AndroidRuntime(16906):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(16906):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
E/AndroidRuntime(16906):     ... 11 more
W/ActivityManager(  144):   Force finishing activity org.test_copydb/.test_copydb
W/ActivityManager(  144): Activity pause timeout for HistoryRecord{4455d728 org.test_copydb/.test_copydb}
I/Process (16906): Sending signal. PID: 16906 SIG: 9
I/ActivityManager(  144): Process org.test_copydb (pid 16906) has died.
I/ActivityManager(  144): Low Memory: No more background processes.
ora sembra che non riconoscere la tabella all'interno del db???quello che continuo a non capire è come sia possibile che la stessa app con i stessi file a disposizione(il database in questione) abbia due risultati differenti a seconda di dove la si esegue  o_O
emulatore -> ok
telefono ->     kaputt
questo è il codice dell'activity:
Codice (Java): [Seleziona]
package org.test_copydb;

import java.io.IOException;
import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.*;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Toast;
import android.widget.Spinner;


public class test_copydb extends Activity {

    private static final String DATABASE_TABLE = "record_type";
    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";  

   
    DBadapter dbadapter;
    SQLiteDatabase db;
   
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
       
        setContentView(R.layout.main);

       
       
        dbadapter = DBadapter.getInstance(this, "helloworld.db");
        db= dbadapter.getDatabase();

        //---get all titles ad populated spinner---
        ArrayList<String> arraylp = new ArrayList<String>();

       
        Cursor c = getAllTitles(db);
        if (c.moveToFirst())
        {
            do {          
                //show the lp
                DisplayTitle(c);
                //add the lp into the array spinner
                arraylp.add(c.getString(1));
               
            } while (c.moveToNext());
        }

        Spinner spinnerchoice = (Spinner) findViewById(R.id.spinner_choice);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_spinner_item, arraylp);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        spinnerchoice.setAdapter(adapter);
       
       
       
        Button button = (Button) findViewById(R.id.button_choice);
        button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
                   
                    Spinner spinnerchoice = (Spinner) findViewById(R.id.spinner_choice);
               
                        String pkg=getPackageName();              
           
                  // creo passaggio di dati alla seconda activity
                  Intent i = new Intent(test_copydb.this, output.class);
                 
                 
                  String strlc = spinnerchoice.getSelectedItem().toString();
                 
                  i.putExtra(pkg+".strlc", strlc);
                 
                  //estrai dal db le ultime due stringhe
 
                    Cursor searchcursor=getTitlefromlc(strlc,db);
                   
                    //allego le due stringhe pe rl aseconda activity
                      i.putExtra(pkg+".strbody",searchcursor.getString(2));
                      i.putExtra(pkg+".strauthor", searchcursor.getString(3));
                   
                   



                   
                  //avvio seconda activity
                  test_copydb.this.startActivity(i);

                  }
        });
       
    }
   
    public void DisplayTitle(Cursor c)
    {
        Toast.makeText(this,
                "id: " + c.getString(0) + "\n" +
                "Language program:\n" + c.getString(1) + "\n" +
                "body:\n" + c.getString(2) + "\n" +
                "author:\n" + c.getString(3),
                Toast.LENGTH_LONG).show();        
    }

   
    public Cursor getAllTitles(SQLiteDatabase db)
    {
        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,SQLiteDatabase db) 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,SQLiteDatabase db) 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;
    }
}
codice dbadapter
Codice (Java): [Seleziona]
package org.test_copydb;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

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

/***
 * Helper singleton class to manage SQLiteDatabase Create and Restore
 *
 * @author alessandrofranzi
 *
 */

// Modify by me 24/6/2010
public class DBadapter extends SQLiteOpenHelper {
        private static SQLiteDatabase sqliteDb;
        private static DBadapter instance;
        private static final int DATABASE_VERSION = 1;
        // the default database path is :
        // /data/data/pkgNameOfYourApplication/databases/
        private static String DB_PATH_PREFIX = "/data/data/";
        private static String DB_PATH_SUFFIX = "/databases/";
        private static final String TAG = "DBadapter";
        private Context context;
       
       

        /***
         * Contructor
         *
         * @param context
         *            : app context
         * @param name
         *            : database name
         * @param factory
         *            : cursor Factory
         * @param version
         *            : DB version
         */

        private DBadapter(Context context, String name,
                        CursorFactory factory, int version) {
                super(context, name, factory, version);
                this.context = context;
                Log.i(TAG, "Create or Open database : " + name);
        }

        /***
         * Initialize method
         *
         * @param context
         *            : application context
         * @param databaseName
         *            : database name
         */

        private static void initialize(Context context, String databaseName) {
                if (instance == null) {
                        /**
                         * Try to check if there is an Original copy of DB in asset
                         * Directory
                         */

                        if (!checkDatabase(context, databaseName)) {
                                // if not exists, I try to copy from asset dir
                                try {
                                        copyDataBase(context, databaseName);
                                } catch (IOException e) {
                                        Log.e(TAG,"Database "+ databaseName+ " does not exists and there is no Original Version in Asset dir");
                                }
                        }

                        Log.i(TAG, "Try to create instance of database (" + databaseName+ ")");
                        instance = new DBadapter(context, databaseName,null, DATABASE_VERSION);
                        sqliteDb = instance.getWritableDatabase();
                        Log.i(TAG, "instance of database (" + databaseName + ") created !");
                }
        }

        /***
         * Static method for getting singleton instance
         *
         * @param context
         *            : application context
         * @param databaseName
         *            : database name
         * @return : singleton instance
         */

        public static final DBadapter getInstance(
                        Context context, String databaseName) {
                initialize(context, databaseName);
                return instance;
        }

        /***
         * Method to get database instance
         *
         * @return database instance
         */

        public SQLiteDatabase getDatabase() {
                return sqliteDb;
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
                Log.d(TAG, "onCreate : nothing to do");

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Log.d(TAG, "onCreate : nothing to do");

        }

        /***
         * Method for Copy the database from asset directory to application's data
         * directory
         *
         * @param databaseName
         *            : database name
         * @throws IOException
         *             : exception if file does not exists
         */

        private void copyDataBase(String databaseName) throws IOException {
                copyDataBase(context, databaseName);
        }

        /***
         * Static method for copy the database from asset directory to application's
         * data directory
         *
         * @param aContext
         *            : application context
         * @param databaseName
         *            : database name
         * @throws IOException
         *             : exception if file does not exists
         */

        private static void copyDataBase(Context aContext, String databaseName)
                        throws IOException {

                // Open your local db as the input stream
                InputStream myInput = aContext.getAssets().open(databaseName);

                // Path to the just created empty db
                String outFileName = getDatabasePath(aContext, databaseName);

                Log.i(TAG, "Check if create dir : " + DB_PATH_PREFIX
                                + aContext.getPackageName() + DB_PATH_SUFFIX);

                // if the path doesn't exist first, create it
                File f = new File(DB_PATH_PREFIX + aContext.getPackageName()
                                + DB_PATH_SUFFIX);
                if (!f.exists())
                        f.mkdir();

                Log.i(TAG, "Trying to copy local DB to : " + outFileName);

                // Open the empty db as the output stream
                OutputStream myOutput = new FileOutputStream(outFileName);

                // transfer bytes from the inputfile to the outputfile
                byte[] buffer = new byte[1024];
                int length;
                while ((length = myInput.read(buffer)) > 0) {
                        myOutput.write(buffer, 0, length);
                }

                // Close the streams
                myOutput.flush();
                myOutput.close();
                myInput.close();

                Log.i(TAG, "DB (" + databaseName + ") copied!");
        }

        /***
         * Method to check if database exists in application's data directory
         *
         * @param databaseName
         *            : database name
         * @return : boolean (true if exists)
         */

        public boolean checkDatabase(String databaseName) {
                return checkDatabase(context, databaseName);
        }

        /***
         * Static Method to check if database exists in application's data directory
         *
         * @param aContext
         *            : application context
         * @param databaseName
         *            : database name
         * @return : boolean (true if exists)
         */

        public static boolean checkDatabase(Context aContext, String databaseName) {
                SQLiteDatabase checkDB = null;

                try {
                        String myPath = getDatabasePath(aContext, databaseName);

                        Log.i(TAG, "Trying to conntect to : " + myPath);
                        checkDB = SQLiteDatabase.openDatabase(myPath, null,
                                        SQLiteDatabase.OPEN_READONLY);
                        Log.i(TAG, "Database " + databaseName + " found!");
                        checkDB.close();
                } catch (SQLiteException e) {
                        Log.i(TAG, "Database " + databaseName + " does not exists!");

                }

                return checkDB != null ? true : false;
        }

        /***
         * Method that returns database path in the application's data directory
         *
         * @param databaseName
         *            : database name
         * @return : complete path
         */

        private String getDatabasePath(String databaseName) {
                return getDatabasePath(context, databaseName);
        }

        /***
         * Static Method that returns database path in the application's data
         * directory
         *
         * @param aContext
         *            : application context
         * @param databaseName
         *            : database name
         * @return : complete path
         */

        private static String getDatabasePath(Context aContext, String databaseName) {
                return DB_PATH_PREFIX + aContext.getPackageName() + DB_PATH_SUFFIX
                                + databaseName;
        }
}
a questo punto mi viene da pensare che sia un problema del mio telefono...avete altri consigli?

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:problema nela gestione db
« Risposta #5 il: 25 Settembre 2010, 18:36:14 CEST »
0
Usi lo stesso api level su telefono ed emulatore?
Postate il LogCat LogCat LogCat LogCat LogCat

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 127
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:problema nela gestione db
« Risposta #6 il: 25 Settembre 2010, 21:15:26 CEST »
0
si lo stesso:
Codice: [Seleziona]
# Project target.
target=Google Inc.:Google APIs:8
sia l'emulatore che il telefono montano android 2.2,se qualcuno può fare una prova col suo cel per verificare se funziona mi farebbe un grosso piacere,qui trovate l' apk:
Download test_copydb.apk, upload your files and earn money.

Offline blackgin

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1387
  • Respect: +164
    • Google+
    • blackgins
    • blackginsoft
    • Mostra profilo
  • Dispositivo Android:
    Galaxy Nexus
  • Sistema operativo:
    Mac OSX 10.8
Re:problema nela gestione db
« Risposta #7 il: 25 Settembre 2010, 21:44:35 CEST »
+1
Ma il galaxy ha giá android 2.2?


Edit: Su nexus one con 2.2 nessun crash. Ma é normale che all'avvio mi spara 5 toast uno piú lungo dell'altro coi codici che poi si trovano nell'app?
« Ultima modifica: 25 Settembre 2010, 21:49:07 CEST da blackgin »
Postate il LogCat LogCat LogCat LogCat LogCat

Offline IacopoDeeNosee

  • Utente junior
  • **
  • Post: 127
  • Respect: +33
    • Google+
    • iacopodeenosee
    • Mostra profilo
    • visualhunter
  • Dispositivo Android:
    Samsung Nexus S - GT-I9023
  • Play Store ID:
    IacopoDeeNosee
  • Sistema operativo:
    Arch linux x86_64
Re:problema nela gestione db
« Risposta #8 il: 25 Settembre 2010, 22:38:22 CEST »
0
grazie per averlo testato  ;-) si è normale l'ho fatto solo per test, allora è il mio cel che da problemi,ed io che c'ho perso una mezza giornata dietro a sto problema  :-[
Off-Topic:
il galaxy ha il 2.2 grazie a drakaz,se aspetavamo la samsung staremo ancora con la 1.5!