Reputation: 5
Im new at android development and this is my first android app using SQLite by following a tutorial but i get error "main java.lang.NullPointerException" when inserting. here is my code:
This is my activity_main.xml code:
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.xperiasola.philubiq64wi.xperiasola.MainActivity">
<EditText
android:id="@+id/etName"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Name"
android:inputType="textPersonName"
app:layout_constraintTop_toTopOf="parent"
tools:layout_editor_absoluteX="0dp" />
<EditText
android:id="@+id/etSurname"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:ems="10"
android:hint="Sname"
android:inputType="textPersonName"
app:layout_constraintTop_toBottomOf="@+id/etName"
tools:layout_editor_absoluteX="0dp" />
<EditText
android:id="@+id/etMarks"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="16dp"
android:ems="10"
android:hint="Marks"
android:inputType="textPersonName"
app:layout_constraintTop_toBottomOf="@+id/etSurname"
tools:layout_editor_absoluteX="0dp" />
<Button
android:id="@+id/btAdd"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Button"
app:layout_constraintTop_toBottomOf="@+id/etMarks"
tools:layout_editor_absoluteX="0dp" />
</android.support.constraint.ConstraintLayout>
This is my DatabaseHelper.java code:
package com.xperiasola.philubiq64wi.xperiasola;
import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/**
* Created by philUbiq64wi on 1/26/2018.
*/
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "student.db";
public static final String TABLE_NAME = "tbl_user";
public static final String COLUMN_1 = "ID";
public static final String COLUMN_2 = "NAME";
public static final String COLUMN_3 = "SURNAME";
public static final String COLUMN_4 = "MARKS";
private static final int DATABASE_VERSION = 1;
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME +
" ( " + COLUMN_1 + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
COLUMN_2 + " TEXT, " +
COLUMN_3 + " TEXT, " +
COLUMN_4 + " TEXT )";
sqLiteDatabase.execSQL(CREATE_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(sqLiteDatabase);
}
public boolean insertData(String name, String surname, String marks) {
SQLiteDatabase sqLiteDatabase = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COLUMN_2, name);
contentValues.put(COLUMN_3, surname);
contentValues.put(COLUMN_4, marks);
long result;
result = sqLiteDatabase.insert(TABLE_NAME, null, contentValues);
if (result == -1) {
return false;
} else {
return true;
}
}
}
This is my MainActivty.java code:
package com.xperiasola.philubiq64wi.xperiasola;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
DatabaseHelper myDb;
private static Button btAdd;
private static EditText etName, etSurname, etMarks;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btAdd = findViewById(R.id.btAdd);
etName = findViewById(R.id.etName);
etSurname = findViewById(R.id.etSurname);
etMarks = findViewById(R.id.etMarks);
AddData();
}
//adding data to SQLite
public void AddData() {
btAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.out.println("activity: "+ etName.getText().toString() + "/ "+ etSurname.getText().toString() +"/ "+ etMarks.getText().toString());
// checking if true or false using DatabaseHelper
boolean isInserted = myDb.insertData(etName.getText().toString(), etSurname.getText().toString(), etMarks.getText().toString());
if (isInserted == true) {
Toast.makeText(MainActivity.this, "Data Inserted", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(MainActivity.this, "Failed Inserted", Toast.LENGTH_SHORT).show();
}
}
});
}
}
The values are getting correctly. Any help would be appreciated but when im testing it, it will force close the app then return error log:
> FATAL EXCEPTION: main
> java.lang.NullPointerException
> at
> com.xperiasola.philubiq64wi.xperiasola.MainActivity$1.onClick(MainActivity.java:34)
> at android.view.View.performClick(View.java:3574)
> at android.view.View$PerformClick.run(View.java:14293)
> at android.os.Handler.handleCallback(Handler.java:605)
> at android.os.Handler.dispatchMessage(Handler.java:92)
> at android.os.Looper.loop(Looper.java:137)
> at android.app.ActivityThread.main(ActivityThread.java:4448)
> at java.lang.reflect.Method.invokeNative(Native Method)
> at java.lang.reflect.Method.invoke(Method.java:511)
> at
> com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
> at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
> at dalvik.system.NativeStart.main(Native Method)
Any suggestion guys? TIA :)
Upvotes: 0
Views: 64
Reputation: 103
you declared DatabaseHelper myDb but never initialized it. Probably that's why myDb is showing null. Initialize the object like this, myDb = new DatabaseHelper();
Upvotes: 0
Reputation: 5748
For the constructor of DatabaseHelper.java
, you have:
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
But the variables name, factory, version
are unused. So I would suggest to change the constructor to:
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
In MainActivty.java
, the DatabaseHelper myDb
is not initialized before used. That's why you are getting main java.lang.NullPointerException
exception.
You can initialized it inside onCreate()
, before calling AddData()
that install onClickListener
to your Button.
@Override
protected void onCreate(Bundle savedInstanceState) {
.....
this.myDb = new DatabaseHelper(this);
AddData();
}
Upvotes: 1