Autore Topic: DataBaseHelper -- Problema --  (Letto 3440 volte)

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
DataBaseHelper -- Problema --
« il: 10 Dicembre 2010, 01:04:46 CET »
0
Questa è la mia classe DataBaseHelper.java

Codice (Java): [Seleziona]
public class DataBaseHelper extends SQLiteOpenHelper{
         
    //The Android's default system path of your application database.
    private static String DB_PATH = "/data/data/my.package/databases/";
 
    private static String DB_NAME = "miodb";
 
    private SQLiteDatabase mydb;
 
    private final Context myContext;
 
    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
     * @param context
     */

    public DataBaseHelper(Context context) {
 
        super(context, DB_NAME, null, 1);
        this.myContext = context;
    }  
 
  /**
     * Creates a empty database on the system and rewrites it with your own database.
     * */

    public void createDataBase() throws IOException{
 
        boolean dbExist = checkDataBase();
 
        if(dbExist){
                //do nothing - database already exist
        }else{
 
                //By calling this method and empty database will be created into the default system path
               //of your application so we are gonna be able to overwrite that database with our database.
                this.getReadableDatabase();
 
                try {
 
                        copyDataBase();
 
                } catch (IOException e) {
 
                        throw new Error("Error copying database");
 
                }
        }
 
    }
 
    /**
     * Check if the database already exist to avoid re-copying the file each time you open the application.
     * @return true if it exists, false if it doesn't
     */

    private boolean checkDataBase(){
 
        SQLiteDatabase checkDB = null;
 
        try{
                String myPath = DB_PATH + DB_NAME;
                checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
        }catch(SQLiteException e){
 
                //database does't exist yet.
 
        }
 
        if(checkDB != null){
 
                checkDB.close();
 
        }
 
        return checkDB != null ? true : false;
    }
 
    /**
     * Copies your database from your local assets-folder to the just created empty database in the
     * system folder, from where it can be accessed and handled.
     * This is done by transfering bytestream.
     * */

    private void copyDataBase() throws IOException{
 
        //Open your local db as the input stream
        InputStream myInput = myContext.getAssets().open(DB_NAME);
 
        // Path to the just created empty db
        String outFileName = DB_PATH + DB_NAME;
 
        //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();
 
    }
 
    public void openDataBase() throws SQLException{
 
        //Open the database
        String myPath = DB_PATH + DB_NAME;
        mydb = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
 
    }
 
    @Override
        public synchronized void close() {
 
            if(mydb != null)
                    mydb.close();
 
            super.close();
 
        }
 
        @Override
        public void onCreate(SQLiteDatabase db) {
 
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
 
        }

In abicabList.java ho il seguente problema
Codice (Java): [Seleziona]
public class abicabList extends ListActivity {
         
        protected EditText searchText;
        protected SQLiteDatabase mydb;
        protected Cursor cursor;
        protected ListAdapter adapter;
         
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mydb = (new DataBaseHelper(this)).getWritableDatabase();
        searchText = (EditText) findViewById (R.id.searchText);
    }
Nel punto
Codice (Java): [Seleziona]
       mydb = (new DataBaseHelper(this)).getWritableDatabase(); mi dà questo errore:
Codice: [Seleziona]
Multiple markers at this line
        - Line breakpoint:abicabList [line: 28] - onCreate
         (Bundle)
        - DatabaseHelper cannot be resolved to a type
e mi suggerisce questo:
http://picasaweb.google.com/lh/photo/DvoFzdQLLVs1N5cAQUvgUg?feat=directlink
« Ultima modifica: 10 Dicembre 2010, 01:09:32 CET da giumazzi »

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #1 il: 10 Dicembre 2010, 11:49:15 CET »
0
Nessuno mi dà una mano a capire perché?

Non capisco perché DataBaseHelper ESISTE

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:DataBaseHelper -- Problema --
« Risposta #2 il: 10 Dicembre 2010, 11:55:05 CET »
0
Magari è un refuso del copia+incolla, ma hai notato che la b è minuscola? Può essere che l'hai scritto minuscolo da qualche parte?

- DatabaseHelper cannot be resolved to a type
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #3 il: 10 Dicembre 2010, 12:03:16 CET »
0
Si avevo notato la b minuscola nell'aiuto ma la B come vedi è maiuscola...
Purtroppo sono al lavoro. A casa stasera ricontrollerò.

Grazie.

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #4 il: 10 Dicembre 2010, 23:43:38 CET »
0
Sistemato il problema con un il comando build project.

Il problema ora è un altro.

1) ho cambiato la DataBaseHelper come segue:
Codice (Java): [Seleziona]
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
//import java.io.InputStreamReader;
//import java.io.BufferedReader;
import java.io.IOException;
import java.io.OutputStream;
//import android.content.ContentValues;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
//import android.database.sqlite.SQLiteDatabase.CursorFactory;

public class DataBaseHelper extends SQLiteOpenHelper{
         
    //The Android's default system path of your application database.
    private String DB_PATH;
 
    private static String DB_NAME = "abicab";
    private static final Integer DB_VERSION = 1;
 
    private SQLiteDatabase mydb;
 
    private final Context myContext;
 
    /**
     * Constructor
     * Takes and keeps a reference of the passed context in order to access to the application assets and resources.
     * @param context
     */

    public DataBaseHelper(Context context) {
 
        super(context, DB_NAME, null, DB_VERSION);
        this.myContext = context;
        DB_PATH = "/data/data/" + context.getPackageName() + "/databases";
    }  
 
    @Override
    public void onCreate(SQLiteDatabase db) {;
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
   
public void apriDatabase() throws SQLException {
    try {
            String percorso = DB_PATH + DB_NAME;
            mydb = SQLiteDatabase.openDatabase(percorso, null, SQLiteDatabase.OPEN_READONLY);
    } catch (Exception e) {
            e.printStackTrace();
    }
}

public void createDataBase() throws IOException{
    boolean dbExist = checkDataBase();
    if(dbExist){
            //do nothing - database already exist
    }else{
            //By calling this method and empty database will be created into the default system path
           //of your application so we are gonna be able to overwrite that database with our database.
            this.getReadableDatabase();
            try {
                    copyDataBase();
            } catch (IOException e) {
                    e.printStackTrace();
            }
    }
}

private void copyDataBase() throws IOException{
    //Open your local db as the input stream
    InputStream myInput = myContext.getAssets().open(DB_NAME);
    // Path to the just created empty db
    String outFileName = DB_PATH + DB_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{
            String myPath = DB_PATH + DB_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(mydb != null)
            mydb.close();
        super.close();
    }
 
}

e questa è la ListActivity
Codice (Java): [Seleziona]
public class abicabList extends ListActivity {
         
        protected EditText searchText;
        protected SQLiteDatabase mydb;
        protected Cursor cursor;
        protected ListAdapter adapter;
         
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mydb = (new DataBaseHelper(this)).getWritableDatabase();
        searchText = (EditText) findViewById (R.id.searchText);
    }
     
    public void search(View view) {

        String text = searchText.getText().toString();
        String cap = "CAP";
        // || is the concatenation operation in SQLite
         if (text.length()<15){
                    cursor = mydb.rawQuery("SELECT _id, ABI, BANCA, CAB, CAP, Filiale, City FROM abicab WHERE ABI || ' ' || CAB || ' ' || City LIKE ? LIMIT 30",  
                            new String[]{"%" + searchText.getText().toString() + "%"});
                                adapter = new SimpleCursorAdapter(
                                                this,  
                                                R.layout.abicab_list_item,  
                                                cursor,  
                                                new String[] {"BANCA", "Filiale", "City", "CAP"},  
                                                new int[] {R.id.BANCA, R.id.Filiale, R.id.City ,R.id.CAP});
                                                setListAdapter(adapter);
                                //istruzione da eseguire
                }

         if (text.startsWith(cap)){
                    cursor = mydb.rawQuery("SELECT _id, ABI, BANCA, CAB, CAP, Filiale, City FROM abicab WHERE CAP LIKE ? LIMIT 3",  
                            new String[]{"%" + searchText.getText().toString().substring(4,8) + "%"});
                                adapter = new SimpleCursorAdapter(
                                                this,  
                                                R.layout.abicab_list_item,  
                                                cursor,  
                                                new String[] {"BANCA", "Filiale", "City", "CAP"},  
                                                new int[] {R.id.BANCA, R.id.Filiale, R.id.City ,R.id.CAP});
                                setListAdapter(adapter);
                                //istruzione da eseguire
                }
         
         if (text.length()>14) {        
        cursor = mydb.rawQuery("SELECT _id, ABI, BANCA, CAB, CAP, Filiale, City FROM abicab WHERE ABI || CAB LIKE ? LIMIT 30",  
                        new String[]{"%" + searchText.getText().toString().substring(6,10) + "%" + searchText.getText().toString().substring(11,15) + "%"});           
        adapter = new SimpleCursorAdapter(
                                this,  
                                R.layout.abicab_list_item,  
                                cursor,  
                                new String[] {"BANCA", "Filiale", "City", "CAP"},  
                                                new int[] {R.id.BANCA, R.id.Filiale, R.id.City ,R.id.CAP});
                                                setListAdapter(adapter);
    }
     
   }  
    public void onListItemClick(ListView parent, View view, int position, long id) {
        Intent intent = new Intent(this, AbicabDetails.class);
        Cursor cursor = (Cursor) adapter.getItem(position);
        intent.putExtra("ABICAB_ID", cursor.getInt(cursor.getColumnIndex("_id")));
        startActivity(intent);
    }  
   
}
Quando lancio l'applicazione mi ritorna questo errore in logcat:
Codice: [Seleziona]
12-10 23:30:47.489: INFO/ActivityManager(50): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.nuovo.abicab/.abicabList }
12-10 23:30:47.628: INFO/ActivityManager(50): Start proc com.example.nuovo.abicab for activity com.example.nuovo.abicab/.abicabList: pid=440 uid=10034 gids={}
12-10 23:30:47.918: DEBUG/dalvikvm(29): GC freed 222 objects / 8512 bytes in 290ms
12-10 23:30:48.159: DEBUG/ddm-heap(440): Got feature list request
12-10 23:30:48.169: DEBUG/dalvikvm(29): GC freed 2 objects / 56 bytes in 240ms
12-10 23:30:48.378: DEBUG/dalvikvm(29): GC freed 2 objects / 56 bytes in 183ms
12-10 23:30:49.100: INFO/ActivityManager(50): Displayed activity com.example.nuovo.abicab/.abicabList: 1513 ms (total 1513 ms)
12-10 23:30:50.749: WARN/KeyCharacterMap(440): No keyboard for id 0
12-10 23:30:50.759: WARN/KeyCharacterMap(440): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
12-10 23:31:02.969: DEBUG/AndroidRuntime(440): Shutting down VM
12-10 23:31:02.978: WARN/dalvikvm(440): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
12-10 23:31:02.992: ERROR/AndroidRuntime(440): Uncaught handler: thread main exiting due to uncaught exception
12-10 23:31:03.049: ERROR/AndroidRuntime(440): java.lang.IllegalStateException: Could not execute method of the activity
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.View$1.onClick(View.java:2031)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.View.performClick(View.java:2364)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.View.onTouchEvent(View.java:4179)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.widget.TextView.onTouchEvent(TextView.java:6541)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.View.dispatchTouchEvent(View.java:3709)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:884)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1659)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1107)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.app.Activity.dispatchTouchEvent(Activity.java:2061)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1643)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1691)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.os.Looper.loop(Looper.java:123)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.app.ActivityThread.main(ActivityThread.java:4363)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at java.lang.reflect.Method.invokeNative(Native Method)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at java.lang.reflect.Method.invoke(Method.java:521)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at dalvik.system.NativeStart.main(Native Method)
12-10 23:31:03.049: ERROR/AndroidRuntime(440): Caused by: java.lang.reflect.InvocationTargetException
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at com.example.nuovo.abicab.abicabList.search(abicabList.java:38)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at java.lang.reflect.Method.invokeNative(Native Method)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at java.lang.reflect.Method.invoke(Method.java:521)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.view.View$1.onClick(View.java:2026)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     ... 22 more
12-10 23:31:03.049: ERROR/AndroidRuntime(440): Caused by: android.database.sqlite.SQLiteException: no such table: abicab: , while compiling: SELECT _id, ABI, BANCA, CAB, CAP, Filiale, City FROM abicab WHERE ABI || ' ' || CAB || ' ' || City LIKE ? LIMIT 30
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.database.sqlite.SQLiteProgram.native_compile(Native Method)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.database.sqlite.SQLiteProgram.compile(SQLiteProgram.java:110)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:49)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1221)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1194)
12-10 23:31:03.049: ERROR/AndroidRuntime(440):     ... 26 more
12-10 23:31:03.099: INFO/Process(50): Sending signal. PID: 440 SIG: 3
12-10 23:31:03.099: INFO/dalvikvm(440): threadid=7: reacting to signal 3
12-10 23:31:03.109: INFO/dalvikvm(440): Wrote stack trace to '/data/anr/traces.txt'
12-10 23:36:03.129: INFO/Process(440): Sending signal. PID: 440 SIG: 9
12-10 23:36:03.188: INFO/ActivityManager(50): Process com.example.nuovo.abicab (pid 440) has died.
12-10 23:36:03.219: INFO/WindowManager(50): WIN DEATH: Window{43da6808 com.example.nuovo.abicab/com.example.nuovo.abicab.abicabList paused=false}
12-10 23:36:03.249: INFO/UsageStats(50): Unexpected resume of com.android.launcher while already resumed in com.example.nuovo.abicab
12-10 23:36:03.378: ERROR/gralloc(50): [unregister] handle 0x2977b8 still locked (state=40000001)
12-10 23:36:03.400: WARN/InputManagerService(50): Got RemoteException sending setActive(false) notification to pid 440 uid 10034

Sembra quindi che non venga trovata la tabella abicab nel db.
Ma la tabella c'è (vedi allegato).

Qualche suggerimento?

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #5 il: 12 Dicembre 2010, 16:49:05 CET »
0
Dopo alcuni giorni di tentativi mi arrendo.
Non riesco ad importare il db dalla asset alla applicazione.
Allego l'intero progetto nella speranza che qualcuno possa darmi una mano.

Grazie in anticipo.

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:DataBaseHelper -- Problema --
« Risposta #6 il: 12 Dicembre 2010, 19:28:40 CET »
0
Scusa, ma createDataBase() non viene MAI utilizzato o sbaglio?

Se non l'hai già fatto guarda come ha risolto il problema Vytek nel suo Almanac: AlmanacSQLiteDatabaseAdapter.java -  almanac -  Project Hosting on Google Code

C'è il codice di tutto il programma, non ti rimane che capire cosa va e riportarlo sul tuo ;)
È 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 giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #7 il: 12 Dicembre 2010, 19:39:14 CET »
0
L'ho provato!
Non va.

Il programma mi funziona solo se metto, fisicamente, il DB nella cartella dell'emulatore!
E quando lo faccio, i permessi di scrittura e lettura da due diventano tre.

Riassumendo, l'adapter crea il file ( size 3072) ma dentro non c'è un dato...., neanche la tabella.

Non capisco proprio.
« Ultima modifica: 13 Dicembre 2010, 00:19:19 CET da giumazzi, Reason: allegato altro progetto »

Offline JD

  • Amministratore
  • Utente storico
  • *****
  • Post: 1600
  • Respect: +232
    • leinardi
    • Mostra profilo
  • Dispositivo Android:
    LG Nexus 5
  • Sistema operativo:
    L'ultima Ubuntu
Re:DataBaseHelper -- Problema --
« Risposta #8 il: 12 Dicembre 2010, 20:06:43 CET »
0
L'ho provato!
Non va.
Che vuol dire che non va? Non ti funziona tutto Almanac? Perché a me Almanac funziona, il tuo progetto invece no.

Il programma mi funziona solo se metto, fisicamente, il DB nella cartella dell'emulatore!
E quando lo faccio, i permessi di scrittura e lettura da due diventano tre.

Riassumendo, l'adapter crea il file ( size 3072) ma dentro non c'è un dato...., neanche la tabella.

Non capisco proprio.

Boh, forse sono io stanco, ma continuo a non vedere DOVE invochi createDataBase() e, di conseguenza, quando viene effettuata la copia del db.
È 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 giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #9 il: 13 Dicembre 2010, 09:08:33 CET »
0
Off-Topic:
Che vuol dire che non va? Non ti funziona tutto Almanac? Perché a me Almanac funziona, il tuo progetto invece no.
Ho provato l'helper di almanac adattandolo alla mia applicazione ma non va.

Off-Topic:
Boh, forse sono io stanco, ma continuo a non vedere DOVE invochi createDataBase() e, di conseguenza, quando viene effettuata la copia del db.
Probabilmente hai ragione.
Nella serie di tentativi ho inserito un helper che non andava proprio.

Ho compattato un'altro progetto con l'helper del mio secondo post.
http://www.anddev.it/index.php/topic,1595.msg10777.html#msg10777

Puoi darci un'occhiata?

Grazie per l'aiuto che vorrai darmi.

Offline Vytek

  • Translate Team
  • Utente junior
  • **
  • Post: 125
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung S5
  • Sistema operativo:
    Windows 8.1
Re:DataBaseHelper -- Problema --
« Risposta #10 il: 13 Dicembre 2010, 09:57:43 CET »
0
Ciao,
da quello che ho capito il problema è dovuto al fatto che il db viene creato vuoto o proprio non creato.
L'Helper principale da cui ho preso la mia versione soffriva tuttavia di un piccolissimo bug, se la cartella non è stata creata lui non copia il file. Ho aggiunto quindi due righe per verificare che la cartella esista e nel caso venga creato. A questo punto il gioco è fatto perchè poi il tutto viene copiato.

Ti allego un po' di riferimenti in modo da poter verificare che il tutto vada secondo quanto ti ho detto.

In pratica:
Codice: [Seleziona]
// 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();


AlmanacSQLiteDatabaseAdapter.java -
 almanac -
 
 Project Hosting on Google Code


Proverò, appena posso, a vedere il tuo codice, comunque controlla attentamente il logcat, perchè, come avrai visto, viene loggata ogni azione ed è quindi abbastanza facile capire dove sia il problema.

Un saluto e fammi sapere come va...

Off-Topic:
Che vuol dire che non va? Non ti funziona tutto Almanac? Perché a me Almanac funziona, il tuo progetto invece no.
Ho provato l'helper di almanac adattandolo alla mia applicazione ma non va.

Off-Topic:
Boh, forse sono io stanco, ma continuo a non vedere DOVE invochi createDataBase() e, di conseguenza, quando viene effettuata la copia del db.
Probabilmente hai ragione.
Nella serie di tentativi ho inserito un helper che non andava proprio.

Ho compattato un'altro progetto con l'helper del mio secondo post.
http://www.anddev.it/index.php/topic,1595.msg10777.html#msg10777

Puoi darci un'occhiata?

Grazie per l'aiuto che vorrai darmi.

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #11 il: 13 Dicembre 2010, 10:10:20 CET »
0
Grazie per l'aiuto; sono al lavoro, appena posso provo il tuo codice.

Volevo solo far presente che nella cartella:
Codice: [Seleziona]
DB_PATH_PREFIX + aContext.getPackageName() + DB_PATH_SUFFIX);
viene creato il database che contiene solo la tabella android_metadata con values it_IT.

Su vari tutorial ho trovato che questa android_metadata deve avere values en_US.

Questa informazione può essere d'aiuto?

Offline Vytek

  • Translate Team
  • Utente junior
  • **
  • Post: 125
  • Respect: +6
    • Mostra profilo
  • Dispositivo Android:
    Samsung S5
  • Sistema operativo:
    Windows 8.1
Re:DataBaseHelper -- Problema --
« Risposta #12 il: 13 Dicembre 2010, 10:22:21 CET »
0
Avevo letto anche io quest'informazione, ma nel mio caso non è importante. Mi spiego: io parto da un db pieno che contiene 366 records che sono poi tutti i santi per ogni giorno, quello che l'applicazione fa la prima volta è:

1) Verificare che esista un db nella classica cartella /data/data/it.almanac/... etc
2) Se non c'e' allora controllo se almeno esiste la cartella, nel caso negativo ovviamente creo la cartella e copio dall'asset il mo db e poi lo apro.

Nelle prove quando ottengo un db vuoto con unica tabella metadata etc...allora qualcosa non è andata a buon fine ed è infatti l'errore che ottenevo quando la cartella non era presente o commettevo qualche altro tipo di errore. Diverso ovviamente se vuoi partire da un db vergine che poi dovrai popolare tramire applicazione, allora molti suggeriscono di non usare questa tecnica, ma soltanto mettere un file txt con tutte le istruzioni SQL per creare il db e quindi copiarlo e poi mandarlo in esecuzione. Dipende quindo molto da quello che l'applicazione deve fare.

Un saluto ...

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #13 il: 13 Dicembre 2010, 15:24:41 CET »
0
Il mio approccio è lo stesso.

Parto da un db pieno e lo devo copiare nella applicazione per poi poter fare delle query.

Il problema è che non lo copia. Manca qualcosa nell'SQLiteOpenHelper?

Puoi provare a far girare l'applicazione che allego http://www.anddev.it/index.php?action=dlattach;topic=1595.0;attach=539?
per vedere qual'è il problema ?

Offline giumazzi

  • Utente junior
  • **
  • Post: 54
  • Respect: +5
    • Mostra profilo
  • Dispositivo Android:
    acer liquid - android 2.1
  • Sistema operativo:
    windows xp - linux xubuntu - easy peasy
Re:DataBaseHelper -- Problema --
« Risposta #14 il: 13 Dicembre 2010, 19:37:55 CET »
0
Ho modifcato la tua classe Almanac come segue:
Codice (Java): [Seleziona]
public class DataBaseHelper extends SQLiteOpenHelper {
        private static SQLiteDatabase abic_;
        private static DataBaseHelper 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 = "DataBaseHelper";
        private Context context;

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

        private DataBaseHelper(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 DataBaseHelper(context, databaseName,
                                        null, DATABASE_VERSION);
                        abic_ = 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 DataBaseHelper getInstance(
                        Context context, String databaseName) {
                initialize(context, databaseName);
                return instance;
        }

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

        public SQLiteDatabase getDatabase() {
                return abic_;
        }

        @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;
        }
}

Purtroppo la classe che utilizza il db mi dà un errore in questa parte
Codice (Java): [Seleziona]
   @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mydb = (new DataBaseHelper(this)).getWritableDatabase();
        searchText = (EditText) findViewById (R.id.searchText);
    }

esattamente questo:
Codice: [Seleziona]
Multiple markers at this line
        - The constructor DataBaseHelper(abicabList) is
         undefined
        - Line breakpoint:abicabList [line: 28] - onCreate
         (Bundle)