gpt4 book ai didi

java - 试图在android中将数据从数据库加载到ListView

转载 作者:搜寻专家 更新时间:2023-11-01 07:51:32 25 4
gpt4 key购买 nike

我试图从 sqlite 数据库中获取数据并将其加载到 ListView 中,但出现此错误

12-23 02:04:01.751 3296-3296/com.chaos.todolist E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.chaos.todolist, PID: 3296
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.chaos.todolist/com.chaos.todolist.show}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2693)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758)
at android.app.ActivityThread.access$900(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1195)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String, java.lang.String[], java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String)' on a null object reference
at com.chaos.todolist.DataBase.getTasks(DataBase.java:28)
at com.chaos.todolist.show.LoadDataFromDataBaseToListView(show.java:30)
at com.chaos.todolist.show.onCreate(show.java:25)
at android.app.Activity.performCreate(Activity.java:6289)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1119)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2758) 
at android.app.ActivityThread.access$900(ActivityThread.java:177) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1448) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:145) 
at android.app.ActivityThread.main(ActivityThread.java:5942) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1400)at com.android.in ternal.os.ZygoteInit.main(ZygoteInit.java:1195)

这是数据库类函数,我有另一个是助手 ..

package com.chaos.todolist;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DataBase {

private SQLiteDatabase mDatabase;
private DB_Helper TODOHelper;

public DataBase(Context context) {
TODOHelper = new DB_Helper(context);
}

public void open() {
mDatabase = TODOHelper.getWritableDatabase();
}

public void close() {
if (mDatabase != null) {
mDatabase.close();
}
}
public Cursor getTasks() {
String[] col = {TODOHelper.COLUMN_ID, TODOHelper.COLUMN_NAME };
Cursor cursor = mDatabase.query(
TODOHelper.TABLE_TASKS, // table name
col , // column names
null, // where clause
null, // where params
null, // groupby
null, // having
TODOHelper.COLUMN_NAME // orderby
);
return cursor;
}

public Cursor getTasksById(int id) {
String[] columns = {TODOHelper.COLUMN_NAME, TODOHelper.COLUMN_DATE,
TODOHelper.COLUMN_ADDRESS};

return mDatabase.query(
DB_Helper.TABLE_TASKS, // table name
columns, // column names
DB_Helper.COLUMN_ID + " = " + id, // where clause // id param. could be here or appended as it is ^
null, // where params
null, // groupby
null, // having
null // orderby
);
}

public void deleteTaskById(int id) {
open();
mDatabase.delete(
DB_Helper.TABLE_TASKS, // table name
DB_Helper.COLUMN_ID +"="+ id, // where clause
null // where params
);
close();
}

public void insertTask(String name, String date, String address) {
mDatabase.beginTransaction();
try {
ContentValues newTask = new ContentValues();
newTask.put(DB_Helper.COLUMN_NAME, name);
newTask.put(DB_Helper.COLUMN_DATE, date);
newTask.put(DB_Helper.COLUMN_ADDRESS, address);
mDatabase.insert(DB_Helper.TABLE_TASKS, null, newTask);
mDatabase.setTransactionSuccessful();
}
finally {
mDatabase.endTransaction();
}
}

public void updateTask(int rowId, String name, String date, String address) {
ContentValues editTask = new ContentValues();
editTask.put(DB_Helper.COLUMN_NAME, name);
editTask.put(DB_Helper.COLUMN_DATE, date);
editTask.put(DB_Helper.COLUMN_ADDRESS, address);

mDatabase.update(
DB_Helper.TABLE_TASKS, // table name
editTask, // values
DB_Helper.COLUMN_ID + " = " + rowId, // where clause
null // where params
);

}
}

这是我应该使用加载数据函数的类显示.java

package com.chaos.todolist;

import android.database.Cursor;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class show extends AppCompatActivity {
ListView listView;
DataBase db;
TextView empty;
Cursor result;
ArrayAdapter adapter;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.show);
listView=( ListView) findViewById(R.id.listView1);
db=new DataBase(show.this);
empty = (TextView) findViewById(android.R.id.empty);
Log.d("show", "is going to load database");
LoadDataFromDataBaseToListView();
listView.setEmptyView(empty);
}

public void LoadDataFromDataBaseToListView() {
result=db.getTasks();
Log.d("show","it got tasks");
if (result != null && result.getCount() > 0) {
Log.d("load data", "Load Data From DataBase To ListView has started");
db.open();
int i = 0;
String[] names = new String[result.getCount()];
int[] ids = new int[result.getCount()];
try {
Log.d("load data","in thr try");
if (result.moveToFirst()) {
int index_id = result.getColumnIndex(DB_Helper.COLUMN_ID);
int index_name = result.getColumnIndex(DB_Helper.COLUMN_NAME);
Log.d("load data", "got the index");
do {
ids[i] = result.getInt(index_id);
String ss = result.getString(index_name);
names[i] = ss;
++i;
} while (result.moveToNext());

db.close();
Log.d("load data", "clossed connection to database");
adapter = new ArrayAdapter<String>(
getApplicationContext(),
R.layout.taskitem,R.id.Task_name,
names);
listView.setAdapter(adapter);
Log.d("load data", "try finished");
}
} catch (Exception e) {
Log.d("load data", "in catch");
Toast.makeText(getApplicationContext(), e.getMessage(),
Toast.LENGTH_LONG).show();
}
Log.d("load data", "finished if");
} else {
Log.d("load data", "in else");
Toast.makeText(this, "is null", Toast.LENGTH_LONG).show();
}
}

protected void onResume() {
super.onResume();

}
protected void onPause()
{
super.onPause();
}
}

最佳答案

添加到上面的海报中,如果您担心保护,您可能希望将 open 方法设为私有(private)或 protected :

protected void open()
{
mDatabase = TODOHelper.getWritableDatabase();
}

然后将构造函数更改为:

public DataBase(Context context) {
TODOHelper = new DB_Helper(context);
open();
}

这可能会在以后节省一些精力。

关于java - 试图在android中将数据从数据库加载到ListView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34426661/

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