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

标签 java android database sqlite

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

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

03-10 12:05:22.455: E/AndroidRuntime(772): 致命异常: main 03-10 12:05:22.455: E/AndroidRuntime(772): java.lang.RuntimeException: 无法实例化 Activity 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): FATAL EXCEPTION: main 03-10 13:07:39.579: E/AndroidRuntime(770): java.lang.RuntimeException: Unable to instantiate activity 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): Caused by: 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)

最佳答案

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

如果 gaCursor 为 null,将抛出 NPE。

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

只需删除 else 部分即可。

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

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

此外,您不在 DBAdaptor.Java 文件中实例化 db,请使用 open() 或添加 this.db = dbonCreate 中(使用 open 更好)

关于java - SQLite 和 Android,移动到数据库中的下一行,检索并显示结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15322132/

相关文章:

MySQL 查询执行时间较长

php - MySQL 查询中的多个 PHP 变量

java - 在 Java 中创建示例时可以使用 "linked list"吗?

android - 给出非法状态异常的 http post

java - 编译器不允许使用枚举名称

android - 动画选择器/状态转换

java - 防止子类从父类(super class)( Activity )进一步处理

java - 在 Java 应用程序中查询内存中的一组对象的技术

java - 使用 Android Annotation 处理 POST 请求

java - 为什么我的 for 循环跳过第一步