我有代码来访问一个完全可以从我的“主要”活动中运行的SQLite表。我正在尝试通过创建一个单独的类来处理数据插入,删除等来使代码更加优雅。
当我将完全相同的代码从主活动移动到单独的类时,我得到以下错误:
方法 openOrCreateDatabase(String,int, null)未定义类型 条形码
我注意到通过使用“Activity”扩展我的数据库类,错误消失了。但是,现在我在运行代码时遇到 NullPointerException 。
如何正确抽象数据库代码并仍能从Android中的活动引用它?
对不起,因为我是Android和Java的新手,因为我的行话是错误的。
以下是完整代码:
package com.example.stockcontrol;
import java.util.Locale;
import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
public class BarCode extends Activity {
public BarCode() {
}
public void insertBarCode(String upc) {
SQLiteDatabase db;
db = openOrCreateDatabase(
"StockControl.db"
, SQLiteDatabase.CREATE_IF_NECESSARY
, null
);
db.setVersion(1);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
ContentValues mUpc = new ContentValues();
mUpc.put("upc", "444");
mUpc.put("description", "Box o toast");
mUpc.put("scan_count", "1");
db.insertOrThrow("tbl_upc", null, mUpc);
}
}
答案 0 :(得分:2)
您应该将相关的Context传递给类,而不是让您的数据库类扩展Activity。您可以在构造函数中传递它,并将Context作为类变量保持引用。
public class BarCode {
private final Context mContext;
public BarCode(Context context) {
mContext = context;
}
public void insertBarCode(String upc) {
SQLiteDatabase db;
db = mContext.openOrCreateDatabase(
"StockControl.db"
, SQLiteDatabase.CREATE_IF_NECESSARY
, null
);
db.setVersion(1);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
ContentValues mUpc = new ContentValues();
mUpc.put("upc", "444");
mUpc.put("description", "Box o toast");
mUpc.put("scan_count", "1");
db.insertOrThrow("tbl_upc", null, mUpc);
}
}
要使用该类,您可以在Activity中执行此操作:
BarCode barCode = new BarCode(this);
barCode.insertBarCode("123456");
答案 1 :(得分:1)
看来,解决这些问题的方法是创建一个数据助手。我遵循了本教程,现在我可以从任何地方引用数据库代码: http://www.screaming-penguin.com/node/7742
编辑: 我发现了一个更好的教程,实际上是谷歌自己的一个很好的教程,它包含了许多做这种事情的最佳实践,包括使用数据适配器来正确抽象数据库访问。这是笔记本教程:http://developer.android.com/resources/tutorials/notepad/index.html
答案 2 :(得分:0)
您可以尝试将DB指针传递给mUpc例程。
mUpc.put(db,"upc","444");
您必须重写mUpc的构造函数才能接受db对象。