- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试让 SQLite 数据库在 Android 上运行。在 MainActivity 中编写了一个小测试,该测试包括在数据库一行的 3 列中输入值。之后,数据被读回并显示在屏幕上以验证它是否有效。
但是我从 logcat 的 SQLiteOpenHelper.getWritableDatabase() 的堆栈跟踪中得到一个空指针异常
对我来说没有多大意义,因为数据库已创建。有什么想法吗?
下面显示的是代码的两个部分,扩展 Activity 的 MainActivity 类和具有创建行、读取、更新和删除的所有方法的数据库类。
在数据库类中有一个名为 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 的完整堆栈跟踪:
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)
最佳答案
在 onCreate
中将 Database db = new Database(context);
更改为 Database db = new Database(this);
您的上下文为空
您还应该更改数据库构造函数
,这样您就不必在每次打开数据库时都实例化SQLiteHelper
类。
public Database(Context c){
context = c;
sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
}
并从 openToRead()
和 openToWrite()
中删除 sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
/p>
关于android - SQLiteOpenHelper.getWritableDatabase(), Android 的 nullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15964850/
我是 Android 开发的新手(坦率地说是整体开发),因此我一直在阅读 Commonsware Busy Coder 的指南。在阅读 SQLite 部分时,有几件事对我来说不是 %100 清楚。以下
我正在尝试在 Sqlite 数据库 中添加当前位置的纬度和经度。但是当我打开我的 Activity 时,它会崩溃并显示 android.database.sqlite.SQLiteOpenHelper
我无法理解我是如何错误地初始化数据库的: java.lang.NullPointerException at android.database.sqlite.SQLiteOpenHel
我有两个 Activity 和多个数据库类,我想在从 Activity1 到 Activity2 时传递附加信息中的数据库类名称,并在 Activity2 中加载 DatabaseAdapter 类。
我正在为我的(初学者/Android)应用程序实现一个数据库。 我不清楚是否 SQLiteOpenHelper 旨在创建数据库(物理上,写入.db/.sql 文件) super() 或者如果仍然由我来
我正在做一些测试,每次我调用 SQLiteOpenHelper.close()然后我尝试重新打开数据库,例如 SQLiteOpenHelper.getWritableDatabase()我得到异常 j
新手Q来自iPhone/MonoTouch C#背景 我有一个来自另一个项目的现有 SQLite 数据库文件。 我在哪里将数据库文件包含到我的 Eclipse 项目中以使其与应用程序一起部署。 我需要
我正在研究 Android SDK,以期为 friend 编写一个简单的应用程序(并且可能用于销售)。 此应用程序将在数据库中搜索关键字并将结果显示在屏幕上,我已经查看了 searchabul 词典和
如果一个应用程序中的多个 Activity 调用我的 SQLiteOpenHelper 的构造函数并将它们自己作为上下文参数,我可以确定它们都将访问同一个数据库吗? 例如,假设我有: package
我不知道是什么锁定了我的数据库。这个应用程序在生产中是全新的,我什至无法执行第一个将用户添加到数据库的操作。我有一个 DatabaseHandler 可以执行所有数据库操作。我的 Activity 正
通常,在 Activity 中,我是这样使用SQLiteOpenHelper DatabaseHandler mDbHelper = new DatabaseHandler(getBaseContex
我想用一些额外的方法(比如 getStreetsCursor)制作 SQLiteOpenHelper,这些方法从我的数据库返回数据。所以我写了这样的东西: public class DBHelper
我为学生创建了一个包含姓名、姓氏、分数字段的数据库,我确实成功地插入和查看了但我不知道如何进行更新和删除。 请在这里帮助我想根据ID进行更新和删除。 最佳答案 在 DatabaseHandler 类中
首先,我是 Android 应用程序的新手,并不是一个人在做这件事。我的队友在我处理这件事的同时进行了设计,并要求我设置数据库以及执行此操作的方法等等。 所以虽然大部分看起来没问题,但我说: Cont
为什么在 SQLiteOpenHelper 类变量的所有演示和教程中总是:public static final 看看: public static final String ORDER_ID
如果您扩展 SQLiteOpenHelper,您必须为构造函数使用上下文。我想知道是否有办法忽略它,并且能够在没有上下文的情况下使用数据库表。 或者至少是限制性的,我的意思是一种项目/类结构的方式,它
android.database.sqlite.SQLiteOpenHelper如果其构造函数的名称参数为 null,则提供使用内存数据库的能力: String: of the database fi
所以我想出了一些想法,我想知道它是否可以实现。 假设我有多个表(数据库模型),每个表都由某个类表示。我不习惯将单例模式与 open helper 一起使用,所以我创建了一些简单的类来提供数据库。我的想
我有一个即将发布的 Android 应用程序,我正在审查我的一些代码。我担心我的 SQLiteOpenHelper 的实现。具体来说,我想验证 onUpgrade 方法中的 oldVersion 和
我一直在使用 Android 和 SQLite 数据库开发应用程序。但我有一些问题。这是我的代码: SQLiteHelperMoney SQLiteHelperMoney1 = new
我是一名优秀的程序员,十分优秀!