NullPointerException:尝试调用虚拟方法'android.database.sqlite.SQLiteDatabase android.content.Context.openOrC
Posted
技术标签:
【中文标题】NullPointerException:尝试调用虚拟方法\'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase【英文标题】:NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase [duplicate]NullPointerException:尝试调用虚拟方法'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase 【发布时间】:2018-01-07 18:00:39 【问题描述】:我得到的错误是
java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory
相关代码——
public void delete(int position)
SQLiteDatabase db = getWritableDatabase(); //this is null
db.execSQL("DELETE FROM LOGIN WHERE _ID=1;");
db.close();
这是 DBHelper.class 中的代码。数据添加和选择有效,但删除只会导致错误。这里有什么问题?
所有 DBHelper 代码
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
import static android.content.ContentValues.TAG;
public class DBHelper extends SQLiteOpenHelper
private Context context;
private DBHelper dbHelper;
public DBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
super(context, name, factory, version);
this.context = context;
@Override public void onCreate(SQLiteDatabase db)
try
String DROP_SQL = "drop table if exists LOGIN";
db.execSQL(DROP_SQL);
catch(Exception ex)
Log.e(TAG, "Exception in DROP_SQL", ex);
StringBuffer sb = new StringBuffer();
sb.append(" CREATE TABLE LOGIN ( ");
sb.append(" _ID INTEGER PRIMARY KEY AUTOINCREMENT, ");
sb.append(" ID TEXT, ");
sb.append(" PW TEXT ) ");
try
db.execSQL(sb.toString());
catch(Exception ex)
Log.e(TAG, "Exception in CREATE_SQL", ex);
Toast.makeText(context, R.string.make, Toast.LENGTH_SHORT).show();
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
Toast.makeText(context, R.string.upgrade, Toast.LENGTH_SHORT).show();
public void addLogin(Login login)
SQLiteDatabase db = getWritableDatabase();
StringBuffer sb = new StringBuffer();
sb.append(" INSERT INTO LOGIN ( ");
sb.append(" ID, PW ) ");
sb.append(" VALUES ( ?, ? ) ");
if(login.getId().equals("") || login.getPw().equals(""))
Toast.makeText(context, R.string.nodata, Toast.LENGTH_SHORT).show();
else
db.execSQL(sb.toString(),
new Object[]
login.getId(),
login.getPw(),
);;
Toast.makeText(context, R.string.insert, Toast.LENGTH_SHORT).show();
public void delete(int position)
SQLiteDatabase db = getWritableDatabase(); //this is null
db.execSQL("DELETE FROM LOGIN WHERE _ID=1;");
db.close();
//????
//db.execSQL("DELETE FROM LOGIN WHERE _ID=" + position + ";");
//?? ???
public List getAllData()
StringBuffer sb = new StringBuffer();
sb.append(" SELECT _ID, ID, PW FROM LOGIN ");
SQLiteDatabase db = getReadableDatabase();
Cursor cursor = db.rawQuery(sb.toString(), null);
List list = new ArrayList();
Login login = null;
while (cursor.moveToNext())
login = new Login();
login.set_id(cursor.getInt(0));
login.setId(cursor.getString(1));
login.setPw(cursor.getString(2));
list.add(login);
return list;
完全错误
08-01 11:14:34.094 23589-23589/com.yonoo.naverloginhelper D/ViewRootImpl: ViewPostImeInputStage processPointer 0 08-01 11:14:34.134 23589-23589/com.yonoo.naverloginhelper D/ViewRootImpl: ViewPostImeInputStage processPointer 1 08-01 11:24:33.866 23589-23589/com.yonoo.naverloginhelper W/IInputConnectionWrapper:非活动 InputConnection 上的 getTextBeforeCursor 08-01 11:24:33.916 23589-23589/com.yonoo.naverloginhelper V/ActivityThread: updateVisibility: ActivityRecorda6dc7d0 token=android.os.BinderProxy@5f1945b com.yonoo.naverloginhelper/com.yonoo.naverloginhelper.DBActivity 显示:真 08-01 11:24:33.916 23589-23589/com.yonoo.naverloginhelper W/IInputConnectionWrapper:非活动 InputConnection 上的 getSelectedText 08-01 11:24:33.916 23589-23589/com.yonoo.naverloginhelper W/IInputConnectionWrapper:非活动 InputConnection 上的 getTextAfterCursor 08-01 11:24:39.086 23589-23589/com.yonoo.naverloginhelper D/ViewRootImpl: MSG_RESIZED_REPORT: ci=Rect(0, 96 - 0, 0) vi=Rect(0, 96 - 0, 0) or=1 08-01 13:36:26.303 23589-23589/com.yonoo.naverloginhelper D/ViewRootImpl: MSG_RESIZED: ci=Rect(0, 96 - 0, 1000) vi=Rect(0, 96 - 0, 1000) or=1 08-01 13:36:26.373 23589-23589/com.yonoo.naverloginhelper I/时间线:时间线:Activity_idle id:android.os.BinderProxy@5f1945b 时间:11500752 08-01 13:36:27.323 23589-23589/com.yonoo.naverloginhelper D/ViewRootImpl: ViewPostImeInputStage processPointer 0 08-01 13:36:27.463 23589-23589/com.yonoo.naverloginhelper D/ViewRootImpl: ViewPostImeInputStage processPointer 1 08-01 13:36:27.963 23589-23589/com.yonoo.naverloginhelper D/ViewRootImpl: ViewPostImeInputStage processPointer 0 08-01 13:36:28.063 23589-23589/com.yonoo.naverloginhelper D/ViewRootImpl: ViewPostImeInputStage processPointer 1 08-01 13:36:28.073 23589-23589/com.yonoo.naverloginhelper D/AndroidRuntime: 关闭虚拟机
java.lang.NullPointerException: 尝试调用虚拟方法 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android. database.DatabaseErrorHandler)' 在空对象引用上 在 android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:283) 在 android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223) 在 android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) 在 com.yonoo.naverloginhelper.DBHelper.delete(DBHelper.java:71) 在 com.yonoo.naverloginhelper.DBActivity.DeleteList(DBActivity.java:70) 在 com.yonoo.naverloginhelper.LoginListAdapter$1.onClick(LoginListAdapter.java:76) 在 android.view.View.performClick(View.java:5702) 在 android.widget.TextView.performClick(TextView.java:10888) 在 android.view.View$PerformClick.run(View.java:22541) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:158) 在 android.app.ActivityThread.main(ActivityThread.java:7229) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
【问题讨论】:
请显示完整的堆栈跟踪 添加了堆栈跟踪 我会检查堆栈跟踪的其余部分是否有错误。由于 onCreate 异常,可能没有创建数据库 其实重复是准确的,Context为null 【参考方案1】:检查您的应用权限。清单和运行时。
您在哪里设置数据库名称和版本?
你可以像这样创建你的构造函数。而且您的数据库名称和版本始终相同。
// Database version
private static final int DATABASE_VERSION = 1;
// Database name
private static final String DATABASE_NAME = MyDatabase.db;
public DBHelper(Context context)
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.context = context;
【讨论】:
以上是关于NullPointerException:尝试调用虚拟方法'android.database.sqlite.SQLiteDatabase android.content.Context.openOrC的主要内容,如果未能解决你的问题,请参考以下文章
NullPointerException:尝试在空对象引用上调用虚拟方法 findViewById(int)'
java.lang.NullPointerException:尝试调用虚拟方法 java.lang.String [重复]
java.lang.NullPointerException:Android 尝试调用虚拟方法错误
NullPointerException:尝试调用虚拟方法“int android.graphics.Bitmap.getWidth()”