当我点击按钮来保存数据库中的内容时,崩溃...
MainActivity.java:
public class MainActivity extends Activity {
private MyAdapter adapter;
private ListView list;
UserDbHelper userDbHelper;
SQLiteDatabase sqLiteDatabase;
Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = (ListView) findViewById(R.id.list);
List<BluetoothDevice> devices = new ArrayList<>();
devices.add(new BluetoothDevice("Hello","hahhahahha",null));
adapter = new MyAdapter(getApplicationContext(),0,devices);
list.setAdapter(adapter);
}
public void btnSaveClick(View view) {
userDbHelper = new UserDbHelper(context);
sqLiteDatabase=userDbHelper.getWritableDatabase();
userDbHelper.store(adapter.getAllItem(),sqLiteDatabase);
}
MyAdapter.java
public class MyAdapter extends ArrayAdapter<BluetoothDevice> {
public MyAdapter(Context context, int resource, List<BluetoothDevice> devices) {
super(context, resource, devices);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// here we can define custom design of list item
TextView textView = new TextView(getContext());
BluetoothDevice item = getItem(position);
textView.setTextColor(Color.BLACK);
textView.setText(item.name + " : " + item.address + " date :" + item.getDateFormatted());
return textView;
}
//method to get all adapter objects
public List<BluetoothDevice> getAllItem() {
List<BluetoothDevice> result = new ArrayList<>();
for (int i = 0; i < getCount(); i++) {
Log.e("fef", "getAllItem: " );
result.add(getItem(i));
}
return result;
}
}
BluetoothDevice.java
public class BluetoothDevice {
public String name;
public String address;
public Date date;
public BluetoothDevice(String name, String address, Date date) {
this.name = name;
this.address = address;
this.date = date;
}
private SimpleDateFormat format = new SimpleDateFormat("dd MMMM yyyy");
public String getDateFormatted() {
if (date == null) {
return " no date ";
}
return format.format(date);
}
}
UserDbHelper.java
public class UserDbHelper extends SQLiteOpenHelper {
public static final String DATABASENAME = "DATABASENAME2";
public static final int DB_VERSION = 1;
public UserDbHelper(Context context)
{
super(context,DATABASENAME,null,DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS BluetoothDevice ( Device VARCHAR , Address VARCHAR , Date VARCHAR);");
}
public Cursor getItemFromDatabase(SQLiteDatabase sqLiteDatabase) {
List<BluetoothDevice> result = new ArrayList<>();
// query database elements
Cursor c = sqLiteDatabase.rawQuery("Select * from BluetoothDevice ;", null);
while (c.moveToNext()) {
Date v = new Date();
v.setTime(c.getInt(c.getColumnIndex("Date")) * 1000);
Date date = new Date();
date.setTime(Long.valueOf(c.getString(c.getColumnIndex("Date"))));
result.add(
new BluetoothDevice(
c.getString(c.getColumnIndex("Device")),
c.getString(c.getColumnIndex("Address")),
date
)
);
}
c.close();
return c;
}
public void store(List<BluetoothDevice> data,SQLiteDatabase sqLiteDatabase) {
for (BluetoothDevice value : data) {
String s = String.valueOf(new Date().getTime());
//insert in database
sqLiteDatabase.execSQL("INSERT INTO BluetoothDevice VALUES(?,?,?);", new String[]{value.name, value.address, s});
}
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
当我点击该保存按钮时,应用程序崩溃并抛出此错误
com.example.myapplication E / AndroidRuntime:FATAL EXCEPTION:main
java.lang.IllegalStateException:无法执行活动的方法
在android.view.View $ 1.onClick(View.java:3591)
在android.view.View.performClick(View.java:4084)
在android.view.View $ PerformClick.run(View.java:16966)
在android.os.Handler.handleCallback(Handler.java:615)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
在java.lang.reflect.Method.invoke(Method.java:511)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
引起:java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invokeNative(Native Method)
在java.lang.reflect.Method.invoke(Method.java:511)
在android.view.View $ 1.onClick(View.java:3586)
在android.view.View.performClick(View.java:4084)
在android.view.View $ PerformClick.run(View.java:16966)
在android.os.Handler.handleCallback(Handler.java:615)
在android.os.Handler.dispatchMessage(Handler.java:92)
在android.os.Looper.loop(Looper.java:137)
在android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
在java.lang.reflect.Method.invoke(Method.java:511)
在
com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786)
答案 0 :(得分:1)
Caused by: java.lang.NullPointerException at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
您传递给context
构造函数的UserDbHelper
未初始化,因此null
。在活动中,只需使用this
作为Context
。取代
userDbHelper = new UserDbHelper(context);
与
userDbHelper = new UserDbHelper(this);
并删除context
字段作为不必要的内容。