gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:15:09 26 4
gpt4 key购买 nike

我正在尝试让一本电话簿在使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com