Sqlitedatabase在android中抛出错误

时间:2016-09-07 16:50:12

标签: android listview android-sqlite start-activity

当我点击按钮来保存数据库中的内容时,崩溃...

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)

1 个答案:

答案 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字段作为不必要的内容。

相关问题