2011-11-25 16 views
5

Quiero buscar datos de la base de datos SQLITE y mostrarlos en una LISTA.No se pueden obtener datos de la base de datos Sqlite

Mi nombre de base de datos es AppDB.db y el nombre de la tabla es Scrip que contiene 3 columnas _id (clave principal) y el símbolo & company_name que son texto.

Quiero buscar solo la segunda y la tercera columna. He copiado la base de datos en la carpeta de Activos.

Me fuerzo a cerrar cuando ejecuto el siguiente código, pero no sé cuál podría ser el motivo. Por favor, ayuda ..

soy principiante absoluto a Android, por lo que cualquier ayuda apreciada ...

Contenido:

1.) DataAttach.java

2.) DBManager. java

3.) LogCat

4.) .xml en breve

5.) AVD Problema

6.) Instantánea de base de datos


1.) DataAttach.java

public class DataAttach extends Activity { 
    private DbManager dbM; 
    private Cursor c; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     try { 
      dbM = new DbManager(this); 
      dbM.createDataBase(); 
      dbM.openDB(); 

      try { 
       c = dbM.fetchAllData(); 
      } catch (Exception e) { 
       throw new Error("\n\nERROR Fetchin data\n\n"); 
      } 

      if (c != null) { 
       SimpleCursorAdapter adapter = new SimpleCursorAdapter(
         this, 
         android.R.layout.simple_list_item_1, 
         c, 
         new String[] { c.getString(c.getColumnIndex("_id")), 
           c.getString(c.getColumnIndex("symbol")), 
           c.getString(c.getColumnIndex("company_name")) }, 
         new int[] { R.id._id, R.id.symbol, R.id.company_name }); 
       ListView list = (ListView) findViewById(R.id.MainLayout); 
       list.setAdapter(adapter); 
      } 
     } 

     catch (Exception e) { 
      throw new Error("\n\nERROR DB failure\n\n"); 
     } 

     finally { 
      c.close(); 
      dbM.close(); 
     } 
    } 
}  

2.) DbManager.java

public class DbManager extends SQLiteOpenHelper { 

    private static final String KEY_ROWID = "_id"; 
    private static final String KEY_SYMBOL = "symbol"; 
    private static final String KEY_COMPANY_NAME = "company_name"; 

    private static final String DATABASE_NAME = "AppDB"; 
    private static final String DATABASE_PATH = "/data/data/com.dbexample/databases/"; 
    private static final Integer DATABASE_VERSION = 3; 
    private static final String DATABASE_TABLE = "Scrip"; 
    // private static final String TAG = "DbManager"; 
    private final Context ctx; 
    private SQLiteDatabase mDb; 

    public DbManager(Context context) { 

     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     this.ctx = context; 
    } 

    /* 
    * Creates a empty database on the system and rewrites it with your own 
    * database. 
    */ 
    public void createDataBase() { 

     if (checkDataBase()) { 
      // 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 can overwrite 
      * that database with our database. 
      */ 
      this.getReadableDatabase(); 

      try { 
       copyDataBase(); 
      } catch (IOException e) { 
       throw new Error("\n\nERROR copying database\n\n"); 
      } 
     } 
    } 

    /* 
    * Check if the database already exist to avoid re-copying the file each 
    * time you open the application. 
    */ 
    private boolean checkDataBase() { 
     SQLiteDatabase checkDB = null; 
     try { 
      String myPath = DATABASE_PATH + DATABASE_NAME; 
      checkDB = SQLiteDatabase.openDatabase(myPath, null, 
        SQLiteDatabase.OPEN_READONLY); 

     } catch (SQLiteException e) { 
      throw new Error("\n\nERROR database does't exist yet\n\n"); 
     } 

     if (checkDB != null) { 
      checkDB.close(); 
     } 
     return checkDB != null ? true : false; 
    } 

    /* 
    * Copies your DB from your local assets-folder to the just created empty DB 
    * in the system folder, from where it can be accessed and handled. 
    */ 
    private void copyDataBase() throws IOException { 
     /* Open your local db as the input stream */ 
     InputStream myInput = ctx.getAssets().open(DATABASE_NAME); 

     /* Path to the just created empty db */ 
     String outFileName = DATABASE_PATH + DATABASE_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); 
     } 

     myOutput.flush(); 
     myOutput.close(); 
     myInput.close(); 
    } 

    public void openDB() throws SQLException { 
     String myPath = DATABASE_PATH + DATABASE_NAME; 
     mDb = SQLiteDatabase.openDatabase(myPath, null, 
       SQLiteDatabase.OPEN_READONLY); 
    } 

    @Override 
    public void close() { 
     mDb.close(); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    } 

    public Cursor fetchAllData() { 
     return mDb.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_SYMBOL, 
       KEY_COMPANY_NAME }, null, null, null, null, null); 

     // return mDb.rawQuery("select _id,symbol,company_name from Scrip", 
     // new String[] { KEY_ROWID,KEY_SYMBOL, KEY_COMPANY_NAME }); 
    } 
}         

3.) LOG CAT

sqlite3_open_v2("/data/data/com.dbexample/databases/AppDB", &handle, 1, NULL) failed 

Failed to open the database. closing it. 

android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file 

at android.database.sqlite.SQLiteDatabase.dbopen(Native Method) 

at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1017)    

4.) Main.xml

Contiene RelativeLayout que tiene 3 TextViews dentro RelativeLayout.


5.) yo siempre conseguir este error

Incluso después de volver a abrir el eclipse, el reinicio del sistema, recreando la AVD, tratando, kill_server y start_server, me sale este mensaje.

Failed to install DataAttach.apk on device 'emulator-5554': device not found 
com.android.ddmlib.InstallException: device not found 
Launch canceled!    

6.) Captura de DB:

Screenshot

DOC TODA Editado para último código Y ACC. A TUS SUGERENCIAS, pero la aplicación no funciona.

+1

SimpleCursorAdapter siempre necesita _id.so intentará obtener _id también en el cursor. – Hiral

+0

@Hiral - intentado, pero el mismo problema :( – GAMA

+0

Pero entonces el problema podría ser algo más, incluido este ... bcz siempre necesitará _id ser pases a SimpleCursorAdapter. – Hiral

Respuesta

3

No sé lo que está tratando de hacer con esta función. Está intentando leer un archivo .db y decir que se creó el DB. La primera vez que intenta ejecutar allí, no habrá un archivo .db en la ruta de la base de datos. Es por eso que se lanza el error 'No such File or Directory'.

11-25 12:06:13.398: E/Netd(31): Unable to bind netlink socket: No such file or directory 

En el DBManager constructor llaman getReadableDatabase del SQLiteOpenHelper() que creará una base de datos si no hay uno. SQLiteOpenHelper

public void createNewDatabase() { 
       InputStream assetsDB = null; 
       try { 
        assetsDB = context.getAssets().open(DATABASE_NAME); 
        OutputStream dbOut = new FileOutputStream(DATABASE_PATH 
          + DATABASE_NAME); 

        byte[] buffer = new byte[1024]; 
        int length; 
        while ((length = assetsDB.read(buffer)) > 0) { 
         dbOut.write(buffer, 0, length); 
        } 

        dbOut.flush(); 
        dbOut.close(); 
        assetsDB.close(); 
        Log.i(TAG, "New database created..."); 
       } catch (IOException e) { 

        Log.e(TAG, "Could not create new database..."); 
       } 
      } 
+0

ya. Intente llamar al método getReadableDatabase() en el constructor. trabajo – SurRam

+0

ya tiene en el constructor de todos modos, nuestro método abierto es un método no estático. Así que seguro creará un objeto para llamarlo. Tener la declaración en el constructor será buena – SurRam

+0

Debería haber mencionado esto en el comentario anterior. U no necesita el método abierto en absoluto. Simplemente tenga getReadableDatabase() en el constructor que creará un db si no es thre. ábrelo si ya está allí. Use esa instancia para hacer todas las funciones relacionadas con ur db. – SurRam

2

SimpleCursorAdapter necesita _id campo en el Cursor se pasa a ella. Así que trate de cambiar la consulta como esta:

return mDb.query(DATABASE_TABLE, new String[] { KEY_ROWID, KEY_SYMBOL, KEY_COMPANY_NAME }, null, null, null, null, null); 

también está recibiendo:

android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

Asegúrate de que llamar close() en todos los objetos que utiliza Cursor cuando haya terminado con ellos.

+0

después de cerrar el cursor y pasar ID, todavía da el mismo problema Gracias de todos modos ! – GAMA

+0

DOC TODO EDITADO AL ÚLTIMO CÓDIGO Y ACCEDE A SUS SUGERENCIAS, pero la aplicación todavía no funciona – GAMA

+0

CÓDIGO ACTUALIZADO, POR FAVOR TENER UNA MIRADA ... – GAMA

2

creo, debe configurar el archivo de diseño como:

SimpleCursorAdapter sca=new SimpleCursorAdapter(context, android.R.layout.simple_list_item_1, c, from, to); 

Debido a que está de paso R.layout.main que se está dando error en la recarga mismo archivo de diseño.

No estoy seguro, pero este podría ser el problema. También agregue _id en su cursor pasado al adaptador.

+0

lo hará. thnx. – GAMA

+0

DOC ENTERO EDITADO AL ÚLTIMO CÓDIGO Y ACC. A TUS SUGERENCIAS, pero la aplicación no funciona. – GAMA

+0

¡Cualquier ayuda apreciada! – GAMA

Cuestiones relacionadas