Java SQLite和Android,移动到数据库中的下一行,检索并显示结果

Java SQLite和Android,移动到数据库中的下一行,检索并显示结果,java,android,database,sqlite,Java,Android,Database,Sqlite,我正在尝试让一个电话簿在Android上工作,它使用SQLite数据库 我正在努力解决的问题是,当我单击“下一步”按钮时,我希望调出数据库中的下一行数据。然而,当我运行应用程序时,我不断地得到这个错误 03-10 12:05:22.455:E/AndroidRuntime(772):致命异常:主 03-10 12:05:22.455:E/AndroidRuntime(772):java.lang.RuntimeException:无法实例化活动组件信息{com.example.addressBo

我正在尝试让一个电话簿在Android上工作,它使用SQLite数据库

我正在努力解决的问题是,当我单击“下一步”按钮时,我希望调出数据库中的下一行数据。然而,当我运行应用程序时,我不断地得到这个错误

03-10 12:05:22.455:E/AndroidRuntime(772):致命异常:主 03-10 12:05:22.455:E/AndroidRuntime(772):java.lang.RuntimeException:无法实例化活动组件信息{com.example.addressBooktake2/com.example.addressBooktake2.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));//
    }
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.addressbooktake2/com.example.addressbooktake2.MainActivity}: java.lang.NullPointerException 03-10 13:07:39.579: E/AndroidRuntime(770):在 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.Invokenactive(本机方法)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):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)03-10 13:07:39.579:E/AndroidRuntime(770):在 dalvik.system.Nativestar.main(本机方法)03-10 13:07:39.579: E/AndroidRuntime(770):由以下原因引起:java.lang.NullPointerException 03-10 13:07:39.579:E/AndroidRuntime(770):在 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):在 com.example.addressbooktake2.DBAdaptor.open(DBAdaptor.java:88)03-10 13:07:39.579:E/AndroidRuntime(770):在 MainActivity.(MainActivity.java:20) 03-10 13:07:39.579:E/AndroidRuntime(770):在 java.lang.Class.newInstanceImpl(本机方法)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)

移动这个

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);
如果
gaCursor
为空,将抛出NPE

如果为空,则无法(也不需要)关闭它。

只需卸下
else
部件即可

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


另外,您不必在DBAdaptor.Java文件中实例化
db
,而是使用
open()
或在
onCreate
中添加
this.db=db
(使用
open
更好)

似乎是从
getallRecord()
返回的
游标对象为空。。。
而空指针异常是指在
DisplayRecord()
中访问的空
光标
对象

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

if(c != null)
    //Display Records
else
    Log.e(TAG, "Cursor is Null");
而且,从数据库中检索联系人的方式似乎不正确。。。
创建某些
ContentProvider
,以使数据库中的数据可供应用程序使用。。。可能会有一些帮助…

在调用
onCreate()
之前,执行逻辑通常是bug的来源。就你而言:

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);
    }
    [...]
}

再看一看

我删除了它,同样的异常仍然发生:(它又在同一个位置了吗?比较两个StackTrace。NPE被抛出在哪一行?getallRecord行是上面的第二个代码窗口。这意味着光标可以获取所有数据库数据。NPE仍然在同一个位置,即使我删除了ELSE部分。对于类似的问题,你应该指出e所在的行异常出现在带有注释的代码示例中,因为我们不能按行号。还要确定该语句中涉及的各种变量/子表达式的值。(即,什么等于
null
)这对于日志记录或调试器来说比通过查看代码容易得多。
DBAdaptor db = new DBAdaptor(this);
int count = 1;
Cursor cursor = db.getallRecord();
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);
    }
    [...]
}