0

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 :)

2 Answers 2

1

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();
}
Sign up to request clarification or add additional context in comments.

1 Comment

I forgot to initialize this.myDb = new DatabaseHelper(this);. Thanks guys :)
0

you declared DatabaseHelper myDb but never initialized it. Probably that's why myDb is showing null. Initialize the object like this, myDb = new DatabaseHelper();

4 Comments

i remove the code then rebuild but error logs are the same :(
you declared DatabaseHelper myDb but never initialized it. Probably that's why myDb is showing null. Inilialize the object like this, myDb = new DatabaseHelper();
Thanks bro sorry for a very noob mistake. It works now :)
can you give an upvote to my answer, please if it helped you in someway.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.