rob
rob

Reputation: 5

Adding data using SQLite in android studio

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

Answers (2)

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

Shuwn Yuan Tee
Shuwn Yuan Tee

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

Related Questions