我想從SQLITE數據庫中獲取數據並將其顯示在LIST中。無法從Sqlite數據庫獲取數據
我的數據庫名稱是AppDB.db,表名是Scrip,它包含3列_id(主鍵)和符號& company_name,它們是文本。
我只想抓取第二列和第三列。我已將數據庫複製到「資產」文件夾中。
當我執行下面的代碼時,我得到強制關閉,但我不知道可能是什麼原因。請幫助..
我絕對初學者到Android,所以任何幫助讚賞...
內容:
1)DataAttach.java
2)DbManager。在簡要
的java3.)的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)的截圖:
全DOC編輯,以最新的代碼和ACC。對於您的建議,但仍然無法使用應用程序。
SimpleCursorAdapter總是需要_id.so嘗試在您的光標中提取_id。 – Hiral
@Hiral - 嘗試過,但同樣的概率:( – GAMA
但是然後問題可能還包括這個..bcz其他問題,你總是需要_id傳遞給SimpleCursorAdapter。 – Hiral