嗨,我在项目中从嵌入式SQLite数据库中读取时遇到了问题。
我想将数据从一个活动转移到另一个活动并在TextView中显示。
这是我的数据库工具类:
public class myDBTools extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/com.example.appscan5/databases/";
private static String DB_NAME = "productlist";
private static SQLiteDatabase myDatabase;
public myDBTools(Context applicationContext) {
super(applicationContext, DB_NAME, null, 1);
}
@Override
public void onCreate(SQLiteDatabase db) {
myDatabase= SQLiteDatabase.openDatabase(DB_PATH + DB_NAME,null, SQLiteDatabase.CREATE_IF_NECESSARY);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public static HashMap<String, String> getProductInfo(String id) {
HashMap<String, String> productMap = new HashMap<String, String>();
String selectQuery = "SELECT * FROM products WHERE _id='" + id + "'";
Cursor cursor = myDatabase.rawQuery(selectQuery, null);
// move to the first row of dataBase
if (cursor.moveToFirst()) {
do {
productMap.put("NumberId", cursor.getString(0));
productMap.put("BarcodeId", cursor.getString(1));
productMap.put("ProductName", cursor.getString(2));
productMap.put("Calories", cursor.getString(3));
productMap.put("Protein", cursor.getString(4));
productMap.put("Carbohydrates", cursor.getString(5));
productMap.put("Fats", cursor.getString(6));
productMap.put("Grams", cursor.getString(7));
} while (cursor.moveToNext());
}
return productMap;
}
}
以下是我在另一项活动中使用它的方法:
myDBTools mydbTools = new myDBTools(this);
HashMap<String, String> productMap = mydbTools.getProductInfo(id);
答案 0 :(得分:1)
您需要先打开数据库。
mydbTools.open();
将上面的行添加到你的oncreate中,它会起作用
答案 1 :(得分:1)
在任何操作之前,您必须Open
数据库:创建开放方法
// ---opens the database---
public myDBTools open() throws SQLException {
db = DBHelper.getWritableDatabase();
return this;
}
操作完成后必须Close
数据库。创建关闭方法
// ---closes the database---
public void close() {
DBHelper.close();
}
现在,在创建名为myDBTools object
和Open
方法的Close
之后,
myDBTools mydbTools = new myDBTools(this);
mydbTools.open();
//All the operations related to database
mydbTools.close();
答案 2 :(得分:0)
在SQLite中使用数据库时遇到了很多麻烦。我似乎一直在创建一个数据库,但没有使用SQLiteOpenHelper将我的数据库文件的内容复制到新创建的数据库。
最后,我有一个没有表格的数据库,而且我无法执行选择查询,这里是我收到错误的地方:
String selectQuery = "SELECT * FROM products WHERE _id='" + id + "'";
Cursor cursor = myDatabase.rawQuery(selectQuery, null);
这是我到目前为止完整的数据库类代码:
public class MyDatabase extends SQLiteOpenHelper {
private static String TAG = MyDatabase.class.getName();
private String DB_PATH = "/data/data/com.example.appscan5/databases/";
private static String DB_NAME = "productlist.db";
private SQLiteDatabase myDataBase = null;
private final Context myContext;
public MyDatabase(Context context) {
super(context, DB_NAME, null, 1);
this.myContext = context;
Log.v("log_tag", "DBPath: " + DB_PATH);
// File f=getDatabasePath(DB_NAME);
}
public void createDataBase() throws IOException {
boolean dbExist = checkDataBase();
SQLiteDatabase db_Read = null;
if (dbExist) {
Log.v("log_tag", "database does exist");
} else {
Log.v("log_tag", "database does not exist");
//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.
db_Read = this.getReadableDatabase();
db_Read.close();
try {
copyDataBase();
} catch (IOException e) {
throw new Error("Error copying database");
}
}
}
private void copyDataBase() throws IOException {
InputStream myInput = myContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
}
private boolean checkDataBase() {
File dbFile = new File(DB_PATH + DB_NAME);
Log.v("dbFile", dbFile + " " + dbFile.exists());
return dbFile.exists();
}
public boolean openDataBase() throws SQLException {
String mPath = DB_PATH + DB_NAME;
myDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.CREATE_IF_NECESSARY);
return myDataBase != null;
}
@Override
public synchronized void close() {
if (myDataBase != null) myDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase db) {
//When i use this createQuery i create a database and don't get an error but the database is empty.
// String createQuery =
// "CREATE TABLE products (numberId INTEGER NOT NULL, barcodeID TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL, calories INTEGER NOT NULL, protein INTEGER,carbohydrates INTEGER, fats INTEGER, grams INTEGER, sodium INTEGER, fibre INTEGER)";
// db.execSQL(createQuery);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.v(TAG, "Upgrading database, this will drop database and recreate.");
}
public HashMap<String, String> getProductInfo(String id) {
HashMap<String, String> productMap = new HashMap<String, String>();
SQLiteDatabase db = this.getReadableDatabase();
openDataBase();
// HERE I GET AN EROR ( NO SUCH TABLE )
String selectQuery = "SELECT * FROM products WHERE barcodeId='" + id + "'";
//String selectQuery = "SELECT * FROM products";
Cursor myCursor = db.rawQuery(selectQuery, null);
if (!myCursor.moveToFirst()) {
Log.w("debug", "No tables!");
} else
Log.w("Done", "Table is here");
do {
productMap.put("NumberId", myCursor.getString(0));
productMap.put("BarcodeId", myCursor.getString(1));
productMap.put("ProductName", myCursor.getString(2));
productMap.put("Calories", myCursor.getString(3));
productMap.put("Protein", myCursor.getString(4));
productMap.put("Carbohydrates", myCursor.getString(5));
productMap.put("Fats", myCursor.getString(6));
productMap.put("Grams", myCursor.getString(7));
productMap.put("Sodium", myCursor.getString(8));
productMap.put("Fibre", myCursor.getString(9));
} while (myCursor.moveToNext());
close();
return productMap;
// My second query here fails, since the database contains no tables.
}
}
以下是我在代码中使用它的方法:
//--------------------------------------------------------------------------------
MyDatabase myDB = new MyDatabase(this);
try {
myDB.createDataBase();
} catch (IOException e) {
e.printStackTrace();
}
HashMap<String, String> productMap =myDB.getProductInfo(id);
//--------------------------------------------------------------------------------
我不太害羞这是使用MyDatabase类的最佳方式。如果有人更好地使用它,请分享解释原因。
干杯!