我正在尝试使用一个使用SQLite数据库的Android电话簿。
我正在努力的是,当我点击我的下一个按钮时,我希望数据库中的下一行数据被启动。但是,当我运行应用程序时,我不断收到此错误
03-10 12:05:22.455:E / AndroidRuntime(772):致命异常:主要 03-10 12:05:22.455:E / AndroidRuntime(772):java.lang.RuntimeException:无法实例化活动ComponentInfo {com.example.adressbooktake2 / com.example.adressbooktake2.MainActivity}:java.lang.NullPointerException
这是我正在使用的代码,
MainActivity.Java
public class MainActivity extends Activity {
DBAdaptor db = new DBAdaptor(this);
int count = 1;
Cursor cursor = db.getallRecord();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DisplayRecord(cursor);
}
public void Nextdata (View view){
if (cursor.moveToNext())
{
DisplayRecord(cursor);
}
}
public void Previousdata (View view){
if (cursor.moveToPrevious())
{
DisplayRecord(cursor);
}
}
public void DisplayRecord(Cursor c) {
EditText nameTxt = (EditText)findViewById(R.id.Name);
EditText phoneTxt = (EditText)findViewById(R.id.Phone);
EditText emailTxt = (EditText)findViewById(R.id.Email);
nameTxt.setText(c.getString(1));
phoneTxt.setText(c.getString(2));
emailTxt.setText(c.getString(3));//
}
DBAdaptor.Java
package com.example.adressbooktake2;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public class DBAdaptor {
public static final String KEY_ROWID = "id";
public static final String KEY_NAME = "name";
public static final String KEY_PHONENUMBER = "phone";
public static final String KEY_EMAIL = "email";
private static final String TAG = "DBAdaptor";
public static final String DATABASE_NAME = "AddressBookDataBase1";
public static final String DATABASE_TABLE = "AddressBook";
public static final int DATABASE_VERSION = 1;
public static final String DATABASE_CREATE = "create table if not exists AddressBook (id integer primary key autoincrement, "
+ "name VARCHAR, phone VARCHAR, email VARCHAR);";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdaptor(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
try
{
db.execSQL(DATABASE_CREATE);
}
catch (SQLException e)
{
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion + " to" + newVersion +
", which will destroy all old data");
db.execSQL("Drop TABLE IF EXISTS AddressBook");
onCreate(db);
}
}
//--counts rows in database--
public int rowCounter()
{
Cursor mCount= db.rawQuery("select count(*) from AddressBook where id=" + KEY_ROWID, null);
mCount.moveToFirst();
int rowCount= mCount.getInt(0);
return rowCount;
}
//--opens the database---
public DBAdaptor open() throws SQLException
{
db = DBHelper.getWritableDatabase(); //Line 88
return this;
}
//--close the dabatabase
public void close()
{
DBHelper.close();
}
//--insert a record into database--
public long insertRecord(String name, String email, String phone)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_EMAIL, email);
initialValues.put(KEY_PHONENUMBER, phone);
return db.insert(DATABASE_TABLE, null, initialValues);
}
//--deletes a record
public void deleteRecord(long rowId)
{
db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null);
}
//--retrieves a particular record--
public Cursor getRecord(long rowId) throws SQLException
{
Cursor mCursor =
db.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, KEY_NAME,
KEY_EMAIL, KEY_PHONENUMBER}, KEY_ROWID + "=" + rowId, null, null, null, null, null);
if (mCursor !=null) {
mCursor.moveToFirst();
}
return mCursor;
}
//--Retrieves all data--
public Cursor getallRecord() throws SQLException
{
{
Cursor gaCursor = db.rawQuery("SELECT* FROM " + DATABASE_TABLE, null);
if (gaCursor !=null)
{
gaCursor.moveToFirst();
}
return gaCursor;
}
}
}
如果你能看到我出错的地方,那么可以给予任何帮助。
异常的完整堆栈跟踪是(2),
03-10 13:07:39.579:E / AndroidRuntime(770):致命异常:主要03-10 13:07:39.579:E / AndroidRuntime(770):java.lang.RuntimeException: 无法实例化活动 ComponentInfo {com.example.adressbooktake2 / com.example.adressbooktake2.MainActivity}: java.lang.NullPointerException 03-10 13:07:39.579: E / AndroidRuntime(770):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2106) 03-10 13:07:39.579:E / AndroidRuntime(770):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 03-10 13:07:39.579:E / AndroidRuntime(770):at android.app.ActivityThread.access $ 600(ActivityThread.java:141)03-10 13:07:39.579:E / AndroidRuntime(770):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1234) 03-10 13:07:39.579:E / AndroidRuntime(770):at android.os.Handler.dispatchMessage(Handler.java:99)03-10 13:07:39.579:E / AndroidRuntime(770):at android.os.Looper.loop(Looper.java:137)03-10 13:07:39.579: E / AndroidRuntime(770):at android.app.ActivityThread.main(ActivityThread.java:5039)03-10 13:07:39.579:E / AndroidRuntime(770):at java.lang.reflect.Method.invokeNative(Native Method)03-10 13:07:39.579:E / AndroidRuntime(770):at java.lang.reflect.Method.invoke(Method.java:511)03-10 13:07:39.579: E / AndroidRuntime(770):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793) 03-10 13:07:39.579:E / AndroidRuntime(770):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)03-10 13:07:39.579:E / AndroidRuntime(770):at dalvik.system.NativeStart.main(Native Method)03-10 13:07:39.579: E / AndroidRuntime(770):引起:java.lang.NullPointerException 03-10 13:07:39.579:E / AndroidRuntime(770):at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:229) 03-10 13:07:39.579:E / AndroidRuntime(770):at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 03-10 13:07:39.579:E / AndroidRuntime(770):at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) 03-10 13:07:39.579:E / AndroidRuntime(770):at com.example.adressbooktake2.DBAdaptor.open(DBAdaptor.java:88)03-10 13:07:39.579:E / AndroidRuntime(770):at com.example.adressbooktake2.MainActivity。(MainActivity.java:20) 03-10 13:07:39.579:E / AndroidRuntime(770):at java.lang.Class.newInstanceImpl(Native Method)03-10 13:07:39.579: E / AndroidRuntime(770):at java.lang.Class.newInstance(Class.java:1319)03-10 13:07:39.579: E / AndroidRuntime(770):at android.app.Instrumentation.newActivity(Instrumentation.java:1054) 03-10 13:07:39.579:E / AndroidRuntime(770):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
答案 0 :(得分:1)
if (gaCursor !=null)
{
gaCursor.moveToFirst();
}
else
{
gaCursor.close();
}
如果gaCursor
为空,则会抛出NPE。
如果它为null,则您无法(也不需要)关闭它。
只需删除else
部分。
您还需要更改DisplayRecord
功能。在调用c
之前检查c.toString()
是否为空。
if (c!= null){
nameTxt.setText(c.getString(1));
phoneTxt.setText(c.getString(2));
emailTxt.setText(c.getString(3));//
}
此外,您没有在DBAdaptor.Java文件中实例化db
,使用open()
或在this.db = db
内添加onCreate
(使用open
是更好)
答案 1 :(得分:1)
在调用onCreate()
之前,它通常是导致逻辑错误的来源。在你的情况下:
DBAdaptor db = new DBAdaptor(this);
int count = 1;
Cursor cursor = db.getallRecord();
尝试仅声明变量并在onCreate
中初始化它们:
public class MainActivity extends Activity {
DBAdaptor db;
int count = 1;
Cursor cursor;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db = new DBAdaptor(this);
cursor = db.getallRecord();
DisplayRecord(cursor);
}
[...]
}
另请查看this SO question
答案 2 :(得分:0)
移动此
EditText nameTxt = (EditText)findViewById(R.id.Name);
EditText phoneTxt = (EditText)findViewById(R.id.Phone);
EditText emailTxt = (EditText)findViewById(R.id.Email);
像这样
setContentView(R.layout.activity_main);
EditText nameTxt = (EditText)findViewById(R.id.Name);
EditText phoneTxt = (EditText)findViewById(R.id.Phone);
EditText emailTxt = (EditText)findViewById(R.id.Email);
DisplayRecord(cursor);
答案 3 :(得分:0)
似乎是Cursor
返回的getallRecord()
对象为空...
并且空指针异常是指Cursor
中访问的空DisplayRecord()
对象...
在显示记录之前执行检查,如下所示:
if(c != null)
//Display Records
else
Log.e(TAG, "Cursor is Null");
此外,似乎没有正确的方式从数据库中检索联系人...
创建了某些ContentProvider
以使数据库中的数据可供应用程序使用... This可能会有所帮助......