I'm trying to make a simple app that can take user entered information and store it in a database from an android phone. The code I have is as follows:
import android.database.sqlite.SQLiteOpenHelper;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import java.io.IOException;
public class MainActivity extends AppCompatActivity {
EditText userentry;
TextView seeuserdata;
DataBaseHelper DataBaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
userentry = (EditText) findViewById(R.id.userentry);
seeuserdata = (TextView) findViewById(R.id.seeUserData);
DataBaseHelper db = new DataBaseHelper(this, null, null, 1);
printDatabase();
}
public void addButtonClicked(View view){
Products product = new Products(userentry.getText().toString());
}
public void deleteButtonClicked(View view){
String inputText = userentry.getText().toString();
DataBaseHelper.deleteProduct(inputText);
printDatabase();
}
public void printDatabase(){
String dbString = DataBaseHelper.databaseToString();
seeuserdata.setText(dbString);
userentry.setText("");
}
};
Products class
public class Products {
private int _id;
private String _productname;
public Products(String _productname){
this._productname=_productname;
}
public void set_id(int _id) {
this._id = _id;
}
public void set_productname(String _productname) {
this._productname = _productname;
}
public int get_id() {
return _id;
}
public String get_productname() {
return _productname;
}
}
And class DataBaseHelper
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;
public class DataBaseHelper extends SQLiteOpenHelper {
private static String DB_PATH = "/data/data/your.package/databases/";
private static String DB_NAME = "products.db";
private static int DB_VERSION = 1;
private static final String TABLE_PRODUCTS = "products";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_PRODUCTNAME = "productname";
private static short WRITE_BUFFER_SIZE = 8192;
private Context context;
public DataBaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public void addProduct(Products product){
ContentValues values = new ContentValues();
values.put(COLUMN_PRODUCTNAME, product.get_productname());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_PRODUCTS, null, values);
db.close();
}
public void deleteProduct(String productName){
SQLiteDatabase db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_PRODUCTS + " WHERE " + COLUMN_PRODUCTNAME + "=\"" + productName + "\";");
}
public String databaseToString(){
String dbString = "";
SQLiteDatabase db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
while(!c.isAfterLast()){
if(c.getString(c.getColumnIndex("productname"))!=null){
dbString += c.getString(c.getColumnIndex("productname"));
dbString += "\n";
}
}
db.close();
return dbString;
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP_TABLE_IF_EXISTS" + TABLE_PRODUCTS);
onCreate(db);
}
@Override
public void onCreate(SQLiteDatabase db) {
String query = "CREATE TABLE" + TABLE_PRODUCTS + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT "+ COLUMN_PRODUCTNAME + " TEXT " + ");";
db.execSQL(query);
}
}
The error is:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.barry.recordtracker, PID: 11938
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.barry.recordtracker/com.example.barry.recordtracker.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.barry.recordtracker.DataBaseHelper.databaseToString()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.example.barry.recordtracker.DataBaseHelper.databaseToString()' on a null object reference
at com.example.barry.recordtracker.MainActivity.printDatabase(MainActivity.java:40)
at com.example.barry.recordtracker.MainActivity.onCreate(MainActivity.java:26)
at android.app.Activity.performCreate(Activity.java:6876)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
at android.app.ActivityThread.access$1100(ActivityThread.java:221)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:158)
at android.app.ActivityThread.main(ActivityThread.java:7224)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
My understanding is that the null object the logs are referring to is the database helper which is initialized in the onCreate method. It looks to me that the database helper is created! Is it not pointing to the database helper? Is it a problem with me initializing the DB helper with (this, null, null, 1)? (meaning that it should be initialized with something else?)