2011-11-25 119 views
5

我想從SQLITE數據庫中獲取數據並將其顯示在LIST中。無法從Sqlite數據庫獲取數據

我的數據庫名稱是AppDB.db,表名是Scrip,它包含3列_id(主鍵)和符號& company_name,它們是文本。

我只想抓取第二列和第三列。我已將數據庫複製到「資產」文件夾中。

當我執行下面的代碼時,我得到強制關閉,但我不知道可能是什麼原因。請幫助..

我絕對初學者到Android,所以任何幫助讚賞...

內容:

1)DataAttach.java

2)DbManager。在簡要

的java

3.)的logcat

4.).XML

5.)AVD問題

6.)數據庫的快照


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中

它包含具有內的RelativeLayout 3個TextViews RelativeLayout的。


5)我總是得到這個錯誤

即使重開食,重新啓動系統,重新創建AVD,努力,kill_server和START_SERVER後,我得到這個消息。

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

6。DB)的截圖:

Screenshot

全DOC編輯,以最新的代碼和ACC。對於您的建議,但仍然無法使用應用程序。

+1

SimpleCursorAdapter總是需要_id.so嘗試在您的光標中提取_id。 – Hiral

+0

@Hiral - 嘗試過,但同樣的概率:( – GAMA

+0

但是然後問題可能還包括這個..bcz其他問題,你總是需要_id傳遞給SimpleCursorAdapter。 – Hiral

回答

3

我不知道你在用這個功能做什麼。您正在嘗試讀取.db文件並說數據庫已創建。第一次嘗試運行時,數據庫路徑中不會有.db文件。這就是爲什麼'沒有這樣的文件或目錄'錯誤被拋出。

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

在DBManager構造函數調用SQLiteOpenHelper的getReadableDatabase()如果沒有一個,這將創建一個數據庫。 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。嘗試在構造函數中調用getReadableDatabase()方法。你有工作 – SurRam

+0

它在構造函數中。反正你的開放方法是非靜態的方法。所以你肯定會創建一個對象來調用它。在構造函數中聲明將是好的 – SurRam

+0

我應該在前面的評論中提到這一點。你根本不需要打開方法。只要在構造函數中有getReadableDatabase(),它將創建一個數據庫,如果它不是thre。如果已經存在,請打開它。使用該實例來完成所有與數據庫相關的功能 – SurRam

2

SimpleCursorAdapter需要在Cursor您傳遞給它_id領域。因此,嘗試改變你的查詢是這樣的:

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

您也越來越:

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

確保你,當你與他們做了你使用的所有Cursor對象調用close()

+0

關閉遊標和傳遞ID後,它仍然給出相同的概率 由於反正! – GAMA

+0

整個DOC編輯爲最新的代碼和ACC。您的建議,但仍然應用程序不起作用。 – GAMA

+0

代碼已更新,請看看... – GAMA

2

我想,你需要設置佈局文件爲:

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

由於您所傳遞R.layout.main這是給你重新加載相同的佈局文件錯誤。

我不確定,但這可能是問題所在。 還要在傳遞給適配器的光標中加上_id。

+0

將做到這一點。日Thnx。 – GAMA

+0

整個DOC編輯到最新的代碼和ACC。對於您的建議,但仍然無法使用應用程序。 – GAMA

+0

任何幫助表示讚賞! – GAMA