Android Java SQLite NullPointerException
我在尝试获取SQLite数据库并执行SQL语句时遇到了一些问题 DatabaseAdapter.javaAndroid Java SQLite NullPointerException,java,android,sqlite,Java,Android,Sqlite,我在尝试获取SQLite数据库并执行SQL语句时遇到了一些问题 DatabaseAdapter.java protected static final String TAG = "DatabaseAdapter"; private final Context mContext; private SQLiteDatabase mDb; private DataBaseHelper mDbHelper; public DatabaseAdapter(Context context) { t
protected static final String TAG = "DatabaseAdapter";
private final Context mContext;
private SQLiteDatabase mDb;
private DataBaseHelper mDbHelper;
public DatabaseAdapter(Context context) {
this.mContext = context;
mDbHelper = new DataBaseHelper(mContext);
}
public DatabaseAdapter createDatabase() throws SQLException {
try {
mDbHelper.createDataBase();
Log.e(TAG, "Database Created");
} catch (IOException mIOException) {
Log.e(TAG, mIOException.toString() + " UnableToCreateDatabase");
throw new Error("UnableToCreateDatabase");
}
return this;
}
public SQLiteDatabase open() throws SQLException {
try {
mDbHelper.openDataBase();
mDbHelper.close();
mDb = mDbHelper.getReadableDatabase();
Log.e(TAG, "Database Open");
} catch (SQLException mSQLException) {
Log.e(TAG, "open >>" + mSQLException.toString());
throw mSQLException;
}
return mDb;
}
public void close() {
mDbHelper.close();
}
DatabaseHelper.java
private static String TAG = "DataBaseHelper"; // Tag just for the LogCat
// window
// destination path (location) of our database on device
private static String DB_PATH = "";
private static String DB_NAME = "schoolAssignment";// Database name
private SQLiteDatabase mDataBase;
private final Context mContext;
public DataBaseHelper(Context context) {
super(context, DB_NAME, null, 1);// 1? its Database Version
DB_PATH = "/data/data/" + context.getPackageName() + "/databases/";
this.mContext = context;
}
public void createDataBase() throws IOException {
// If database not exists copy it from the assets
Log.e(TAG, "CreateDataBase()");
boolean mDataBaseExist = checkDataBase();
if (!mDataBaseExist) {
this.getReadableDatabase();
this.close();
try {
// Copy the database from assests
copyDataBase();
Log.e(TAG, "createDatabase database created");
} catch (IOException mIOException) {
throw new Error("ErrorCopyingDataBase");
}
}
}
// Check that the database exists here: /data/data/your package/databases/Database
// Name
private boolean checkDataBase() {
File dbFile = new File(DB_PATH + DB_NAME);
Log.e("dbFile", dbFile + " "+ dbFile.exists());
return dbFile.exists();
}
// Copy the database from assets
private void copyDataBase() throws IOException {
InputStream mInput = mContext.getAssets().open(DB_NAME);
String outFileName = DB_PATH + DB_NAME;
OutputStream mOutput = new FileOutputStream(outFileName);
byte[] mBuffer = new byte[1024];
int mLength;
while ((mLength = mInput.read(mBuffer)) > 0) {
mOutput.write(mBuffer, 0, mLength);
}
mOutput.flush();
mOutput.close();
mInput.close();
}
// Open the database, so we can query it
public boolean openDataBase() throws SQLException {
String mPath = DB_PATH + DB_NAME;
// Log.v("mPath", mPath);
mDataBase = SQLiteDatabase.openDatabase(mPath, null,
SQLiteDatabase.CREATE_IF_NECESSARY);
// mDataBase = SQLiteDatabase.openDatabase(mPath, null,
// SQLiteDatabase.NO_LOCALIZED_COLLATORS);
return mDataBase != null;
}
@Override
public synchronized void close() {
if (mDataBase != null)
mDataBase.close();
super.close();
}
@Override
public void onCreate(SQLiteDatabase arg0) {
// TODO Auto-generated method stub
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
Exercise.java
TableLayout table_layout;
private SQLiteDatabase mDb;
public Exercise(){
this.mDb = new DataBaseHelper(this).getReadableDatabase();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabhost);
table_layout = (TableLayout) findViewById(R.id.TableLayout);
BuildTable();
}
private void BuildTable() {
try {
String sql = "SELECT * FROM exercise";
Cursor mCur = mDb.rawQuery(sql, null);
if (mCur.getCount() != 0) {
if (mCur.moveToFirst()) {
do {
int rows = mCur.getCount();
int cols = mCur.getColumnCount();
// outer for loop
for (int i = 0; i < rows; i++) {
TableRow row = new TableRow(this);
row.setLayoutParams(new LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT));
// inner for loop
for (int j = 0; j < cols; j++) {
TextView tv = new TextView(this);
tv.setLayoutParams(new LayoutParams(
LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
tv.setGravity(Gravity.CENTER);
tv.setTextSize(18);
tv.setPadding(0, 5, 0, 5);
tv.setText(mCur.getString(j));
row.addView(tv);
}
table_layout.addView(row);
}
} while (mCur.moveToNext());
}
}
} catch (SQLException mSQLException) {
throw mSQLException;
}
以下是错误消息,作为我的日志:
07-30 09:00:04.251: E/AndroidRuntime(16151): FATAL EXCEPTION: main
07-30 09:00:04.251: E/AndroidRuntime(16151): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{edu.nyp.project/edu.nyp.project.Exercise}: java.lang.NullPointerException
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1894)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.app.ActivityThread.access$600(ActivityThread.java:127)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.os.Looper.loop(Looper.java:137)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.app.ActivityThread.main(ActivityThread.java:4512)
07-30 09:00:04.251: E/AndroidRuntime(16151): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 09:00:04.251: E/AndroidRuntime(16151): at java.lang.reflect.Method.invoke(Method.java:511)
07-30 09:00:04.251: E/AndroidRuntime(16151): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982)
07-30 09:00:04.251: E/AndroidRuntime(16151): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749)
07-30 09:00:04.251: E/AndroidRuntime(16151): at dalvik.system.NativeStart.main(Native Method)
07-30 09:00:04.251: E/AndroidRuntime(16151): Caused by: java.lang.NullPointerException
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:228)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:231)
07-30 09:00:04.251: E/AndroidRuntime(16151): at edu.nyp.project.Exercise.<init>(Exercise.java:29)
07-30 09:00:04.251: E/AndroidRuntime(16151): at java.lang.Class.newInstanceImpl(Native Method)
07-30 09:00:04.251: E/AndroidRuntime(16151): at java.lang.Class.newInstance(Class.java:1319)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.app.Instrumentation.newActivity(Instrumentation.java:1026)
07-30 09:00:04.251: E/AndroidRuntime(16151): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1885)
07-30 09:00:04.251: E/AndroidRuntime(16151): ... 11 more
问题在于Exercise类中的空构造函数。当我移除它时,它运行得非常好。我不知道它为什么会这样。有导游吗
提前谢谢 你做不到
this.mDb = new DataBaseHelper(this).getReadableDatabase();
在构造函数中,因为活动上下文不存在。该行必须位于onCreate、onResume或onStart方法中
@凌驾
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tabhost);
this.mDb = new DataBaseHelper(this).getReadableDatabase(); ///This Line
table_layout = (TableLayout) findViewById(R.id.TableLayout);
BuildTable();
}
请不要为您的活动创建任何构造函数。将任何初始化放在onCreate中。获取null的原因是上下文仍然为null。相关:@AndrewT您对如何将其应用到我的问题中有什么想法吗?您使用的是现有的SQLite数据库文件吗?目前,正如错误所说,数据库中没有练习表,我假设发生了错误,数据库为空。我从SQLite browser创建了一个数据库,并将其放入项目的assets文件夹中。我这样做对吗?如果我将行移到onCreate中,它会抛出空指针异常错误。@20美分,我会将它移到onCreate中,然后再次检查错误。也许错误是由不同的来源造成的。相同的NullPointerException,但源不同。@AndrewT。我已经删除了Exercise类中的两个构造函数,并将代码修改为您提供的代码。现在,错误消息在已编辑部分中显示为LogCat。你能帮我看看吗?