1

我正在尝试获取在使用 SQLite 数据库的 Android 上运行的电话簿。

我正在努力解决的问题是,当我单击下一个按钮时,我希望显示数据库中的下一行数据。但是,当我运行应用程序时,我不断收到此错误

03-10 12:05:22.455: E/AndroidRuntime(772): 致命异常: main 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): 致命异常: main 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): 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 android.app .ActivityThread.access$600(ActivityThread.java:141) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234) 03-10 13: 07:39.579:E/AndroidRuntime(770):在 android.os.Handler。dispatchMessage(Handler.java:99) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 android.os.Looper.loop(Looper.java:137) 03-10 13:07:39.579: E/ AndroidRuntime(770): 在 android.app.ActivityThread.main(ActivityThread.java:5039) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 java.lang.reflect.Method.invokeNative(Native Method) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 java.lang.reflect.Method.invoke(Method.java:511) 03-10 13:07:39.579: E/AndroidRuntime(770): 在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): Caused作者:java.lang。NullPointerException 03-10 13:07:39.579: E/AndroidRuntime(770): 在 android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:229) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 android .database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 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): 在 java.lang.Class.newInstanceImpl(Native Method) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 java.lang.Class.newInstance(Class.java:1319) 03-10 13:07:39.579: E/AndroidRuntime(770): 在 android.app.Instrumentation.newActivity(Instrumentation.java:1054) 03-10 13:07:39.579: E/AndroidRuntime(770): 在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)

4

4 回答 4

1
    if (gaCursor !=null) 
    {
        gaCursor.moveToFirst();
    }
    else
    {
        gaCursor.close();
    }

gaCursor如果为空,将抛出 NPE 。

如果它为空,您不能(也不需要)关闭它。

只需卸下else零件。

您还需要更改DisplayRecord功能。c在调用之前检查是否为空c.toString()

if (c!= null){
    nameTxt.setText(c.getString(1));
    phoneTxt.setText(c.getString(2));
    emailTxt.setText(c.getString(3));//
}

此外,你不要db在你的 DBAdaptor.Java 文件中实例化,Wither 在里面使用open()或添加(使用更好)this.db = dbonCreateopen

于 2013-03-10T12:21:58.557 回答
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);
    }
    [...]
}

也看看这个 SO question

于 2013-03-10T13:23:11.353 回答
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);
于 2013-03-10T12:20:32.827 回答
0

似乎是Cursor从返回的对象getallRecord()为null...而Null Pointer Exception是指...Cursor中访问的null对象DisplayRecord()

在显示记录之前执行检查,如下所示:

if(c != null)
    //Display Records
else
    Log.e(TAG, "Cursor is Null");

此外,这似乎不是从数据库中检索联系人的正确方式...ContentProvider创建了某些 's 以使数据库中的数据可用于应用程序...可能会有所帮助...

于 2013-03-10T12:39:49.777 回答