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

时间:2013-03-10 12:18:40

标签: java android database sqlite

我正在尝试使用一个使用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)

4 个答案:

答案 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可能会有所帮助......