SQLiteOpenHelper.getWritableDatabase()的nullPointerException,Android
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了SQLiteOpenHelper.getWritableDatabase()的nullPointerException,Android,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4811字,纯文字阅读大概需要7分钟。
内容图文
我正在尝试使SQLite数据库在Android上工作.在MainActivity中编写了一个小型测试,该测试包括在数据库的一行的3个列中输入值.之后,将数据读出并显示在屏幕上以验证其是否有效.
但是我从Logcat的stacktrace中获取了SQLiteOpenHelper.getWritableDatabase()的空指针异常
对我来说没有太大意义,因为创建了数据库.有任何想法吗?
下面显示的是代码的两部分,扩展了Activity的MainActivity类和具有创建行,读取,更新和删除所有方法的Database类.
Database类内部是一个嵌套类,称为SQLiteHelper,它扩展了SQLiteOpenHelper.
扩展Activity的MainActivity类:
public class MainActivity extends Activity {
Button buttonOne;
EditText editTextOne;
EditText editTextTwo;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
buttonOne = (Button) findViewById(R.id.button1);
editTextOne = (EditText) findViewById(R.id.edittext1);
editTextTwo = (EditText) findViewById(R.id.edittext2);
//insert new row
Database db = new Database(context);
db.openToWrite();
db.insertNewRow(1, "testlabel", 210);
Toast.makeText(MainActivity.this,"new row inserted", Toast.LENGTH_SHORT).show();
// display all rows
int price = 0;
String name = "";
int status = 0;
String result = "";
db.openToRead();
result = db.getAllFromDB();
db.close();
editTextOne.setText(result);
} // end onCreate
}
嵌套类SQLiteHelper扩展了嵌套在数据库类内部的SQLiteOpenHelper
public class SQLiteHelper extends SQLiteOpenHelper {
public SQLiteHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(SCRIPT_CREATE_DATABASE);
}
}
}
数据库类:
public class Database {
public static final String MYDATABASE_NAME = "my_database";
public static final String MYDATABASE_TABLE = "my_table";
public static final int MYDATABASE_VERSION = 1;
public static final String KEY_CHECKBOX_STATUS = "check_box_status";
public static final String KEY_CHECKBOX_LABEL = "check_box_label";
public static final String KEY_PRICE = "price";
//create table MY_DATABASE (ID integer primary key, Content text not null);
private static final String SCRIPT_CREATE_DATABASE =
"CREATE TABLE " + MYDATABASE_TABLE + " (" + "ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
"KEY_CHECKBOX_STATUS INTEGER, " + "KEY_CHECKBOX_LABEL TEXT, " + " KEY_PRICE INTEGER" + ");";
SQLiteDatabase sqLiteDatabase;
SQLiteHelper sqLiteHelper;
Context context;
public Database(Context c){
context = c;
}
public void openToRead() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
sqLiteDatabase = sqLiteHelper.getReadableDatabase();
}
public void openToWrite() throws android.database.SQLException {
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
sqLiteDatabase = sqLiteHelper.getWritableDatabase();
}
public void close(){
sqLiteHelper.close();
}
// after this is all the methods for getting and updating and inserts to database
编辑:来自Logcat的完整stacktrace添加如下:
FATAL EXCEPTION:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.dbtester/com.example.dbtester.MainActivity}: java.lang.NullPointerException
android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981)
android.app.ActivityThread.access$600(ActivityThread.java:123)
android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147)
android.os.Handler.dispatchMessage(Handler.java:99)
android.os.Looper.loop(Looper.java:137)
android.app.ActivityThread.main(ActivityThread.java:4424)
java.lang.reflect.Method.invokeNative(Native Method)
java.lang.reflect.Method.invoke(Method.java:511)
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
dalvik.system.NativeStart.main(Native Method)
caused by: java.lang.NullPointerException
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
at com.example.dbtester.Database.openToWrite(Database.java:40)
at com.example.dbtester.MainActivity.onCreate(MainActivity.java:32)
android.app.Activity.performCreate(Activity.java:4465)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
解决方法:
您的上下文为null change数据库db = new Database(context);到数据库db = new Database(this);在onCreate中
您还应该更改数据库构造函数,以便不必在每次打开数据库时都实例化SQLiteHelper类.
public Database(Context c){
context = c;
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
}
并删除sqLiteHelper = new SQLiteHelper(context,MYDATABASE_NAME,null,MYDATABASE_VERSION);从您的openToRead()和openToWrite()
内容总结
以上是互联网集市为您收集整理的SQLiteOpenHelper.getWritableDatabase()的nullPointerException,Android全部内容,希望文章能够帮你解决SQLiteOpenHelper.getWritableDatabase()的nullPointerException,Android所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。