So after editing a method in my MainAcivity, I'm getting a RuntimeException.
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tim.timapp
/com.example.tim.timapp.MainActivity}: java.lang.IllegalStateException:
Activity has been destroyed
I honestly have no idea where this is coming from. Searching online suggests that it's a big with the ChildFragmentManager, but doesn't give me a fix that works for me.
Any idea what I can do to fix this exception?
PS. If you need any more code or info, let me know. My mind is quite flustered by this error, so I might overlooked some stuff here.
Full log:
03-30 21:19:47.910 24785-24785/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.tim.timapp, PID: 24785
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.tim.timapp/com.example.tim.timapp.MainActivity}: java.lang.IllegalStateException: Activity has been destroyed
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Activity has been destroyed
at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1433)
at android.app.BackStackRecord.commitInternal(BackStackRecord.java:687)
at android.app.BackStackRecord.commit(BackStackRecord.java:663)
at com.example.tim.timapp.MainActivity.DrawVariableFragments(MainActivity.java:271)
at com.example.fragments.Settings.GeneralSettingsFragment.onCreateView(GeneralSettingsFragment.java:57)
at android.app.Fragment.performCreateView(Fragment.java:2220)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:973)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1130)
at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1953)
at android.app.FragmentController.dispatchActivityCreated(FragmentController.java:152)
at android.app.Activity.performCreateCommon(Activity.java:6232)
at android.app.Activity.performCreate(Activity.java:6239)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
at android.app.ActivityThread.-wrap11(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
MainActivity (Sorry about the mess, it's a WIP):
Sorry about this, but I went over the 30.000 characters limit with the entire file.
http://pastebin.com/XZ9k995G
DBHandler (Was giving me grief earlier, so might have something to do with it):
package com.example.tim.timapp;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.util.Log;
import java.util.ArrayList;
public class DBHandler extends SQLiteOpenHelper {
private static String tag = "TEST DBHandler";
private static DBHandler sInstance;
// Database Stuff
private static final int DATABASE_VERSION = 6;
private static final String DATABASE_NAME = "LinkDatabase.db";
// Table Stuff
private static final String TABLE_LinkTable = "LinkTable";
private static final String TABLE_SettingsTable = "SettingsTable";
// LinkTable Stuff
private static final String LT_COLUMN_ID = "_id";
private static final String LT_COLUMN_NAME = "name";
private static final String LT_COLUMN_TAG = "tag";
// SettingsTable Stuff
private static final String ST_COLUMN_ID = "_id";
private static final String ST_COLUMN_NAME = "name";
private static final String ST_COLUMN_IP = "ip";
private static final String ST_COLUMN_PORT = "port";
private static final String ST_COLUMN_USERNAME = "username";
private static final String ST_COLUMN_PASS = "pass";
// Table Create Statements
// LinkTable Create Statement
private static final String CREATE_TABLE_LINKS =
"CREATE TABLE " + TABLE_LinkTable + "(" +
LT_COLUMN_ID + " INTEGER PRIMARY KEY, " +
LT_COLUMN_NAME + " TEXT, " +
LT_COLUMN_TAG + " TEXT" + ");";
// SettingsTable Create Statement
private static final String CREATE_TABLE_SETTINGS =
"CREATE TABLE " + TABLE_SettingsTable + "(" +
ST_COLUMN_ID + " INTEGER PRIMARY KEY, " +
ST_COLUMN_NAME + " TEXT, " +
ST_COLUMN_IP + " TEXT, " +
ST_COLUMN_PORT + " TEXT, " +
ST_COLUMN_USERNAME + " TEXT, " +
ST_COLUMN_PASS + " TEXT" + ");";
// TODO: 28-Mar-16 DON"T FORGET TO UPDATE
// Don't forget to update this when adding a new table.
private static final ArrayList<String> createTablesArray = new ArrayList<String>() {{add(CREATE_TABLE_LINKS); add(CREATE_TABLE_SETTINGS);}};
private static final ArrayList<String> tableNamesArray = new ArrayList<String>() {{add(TABLE_LinkTable); add(TABLE_SettingsTable);}};
public ArrayList<String> tagArray;
public static synchronized DBHandler getInstance(Context context) {
if (sInstance == null) {
Log.d(tag, "sInstance == null");
sInstance = new DBHandler(context.getApplicationContext());
}
return sInstance;
}
private DBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db) {
for (String s : createTablesArray) {
db.execSQL(s);
}
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
for (String s : tableNamesArray) {
db.execSQL("DROP TABLE IF EXISTS " + s);
}
onCreate(db);
}
public ArrayList<String> returnArray(String base, String column) {
SQLiteDatabase db;
db = getWritableDatabase();
String TABLENAME;
if (base.equalsIgnoreCase("StuffManager")) {
TABLENAME = TABLE_LinkTable;
} else if (base.equalsIgnoreCase("GeneralSettings")) {
TABLENAME = TABLE_SettingsTable;
} else {
Log.e(tag, "String Base not recognised");
return null;
}
String query = "SELECT * FROM " + TABLENAME + " WHERE 1";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
ArrayList<String> tempArray = new ArrayList<>();
int i = 0;
while(!c.isAfterLast()){
if(c.getString(c.getColumnIndex(column)) != null){
tempArray.add(i, c.getString(c.getColumnIndex(column)));
} else {
Log.e(tag, "String Column not recognised");
return null;
}
c.moveToNext();
i++;
}
c.close();
if (db != null && db.isOpen()) {
db.close();
}
return tempArray;
}
// *** --------- ***
//
// All methods for the SETTINGS_TABLES
//
// *** --------- ***
public void addSettings(String name, String ip, String port, String username, String pass) {
ContentValues values = new ContentValues();
values.put(ST_COLUMN_NAME, name);
values.put(ST_COLUMN_IP, ip);
values.put(ST_COLUMN_PORT, port);
values.put(ST_COLUMN_USERNAME, username);
values.put(ST_COLUMN_PASS, pass);
SQLiteDatabase db;
db = getWritableDatabase();
db.insert(TABLE_SettingsTable, null, values);
db.close();
}
public void updateSettings(int id, String name, String ip, String port, String username, String pass) {
ContentValues values = new ContentValues();
values.put(ST_COLUMN_NAME, name);
values.put(ST_COLUMN_IP, ip);
values.put(ST_COLUMN_PORT, port);
values.put(ST_COLUMN_USERNAME, username);
values.put(ST_COLUMN_PASS, pass);
SQLiteDatabase db;
db = getWritableDatabase();
db.update(TABLE_SettingsTable, values, "_id=" + id, null);
db.close();
}
public void deleteSettings(String name) {
SQLiteDatabase db;
db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_SettingsTable + " WHERE " + ST_COLUMN_NAME + "=\"" + name + "\";");
db.close();
}
public void deleteAllSettings() {
SQLiteDatabase db;
db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_SettingsTable + " WHERE 1");
db.close();
}
public float settingsTableSize() {
SQLiteDatabase db;
db = getReadableDatabase();
float amount = DatabaseUtils.queryNumEntries(db, TABLE_SettingsTable);
db.close();
return amount;
}
public ArrayList<String> settingsNameArrayMethod() {
SQLiteDatabase db;
db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_SettingsTable + " WHERE 1";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
int i = 0;
ArrayList<String> nameArray = new ArrayList<>();
while (!c.isAfterLast()) {
if (c.getString(c.getColumnIndex("name")) != null) {
nameArray.add(i, c.getString(c.getColumnIndex("name")));
}
c.moveToNext();
i++;
}
c.close();
db.close();
return nameArray;
}
// *** --------- ***
//
// All methods for the LINK_TABLES
//
// *** --------- ***
public void addStuffLink(String name, String tag) {
ContentValues values = new ContentValues();
values.put(LT_COLUMN_NAME, name);
values.put(LT_COLUMN_TAG, tag);
SQLiteDatabase db;
db = getWritableDatabase();
db.insert(TABLE_LinkTable, null, values);
db.close();
}
public Bundle updateStuffLink(int id, String name, String tag) {
ContentValues values = new ContentValues();
values.put(LT_COLUMN_NAME, name);
values.put(LT_COLUMN_TAG, tag);
SQLiteDatabase db;
db = getWritableDatabase();
db.update(TABLE_LinkTable, values, "_id=" + id, null);
db.close();
ArrayList<String> nameArray = stuffLinksNameArrayMethod();
ArrayList<String> tagArray = tagArrayMethod();
Bundle bundle = new Bundle();
bundle.putStringArrayList("nameArray", nameArray);
bundle.putStringArrayList("tagArray", tagArray);
return bundle;
}
public void deleteStuffLink(String name) {
SQLiteDatabase db;
db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_LinkTable + " WHERE " + LT_COLUMN_NAME + "=\"" + name + "\";");
db.close();
}
public void deleteAllStuffLinks() {
SQLiteDatabase db;
db = getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_LinkTable + " WHERE 1");
db.close();
}
public ArrayList<String> stuffLinksNameArrayMethod(){
SQLiteDatabase db;
db = getWritableDatabase();
String query = "SELECT * FROM " + TABLE_LinkTable + " WHERE 1";
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
int i = 0;
ArrayList<String> nameArray = new ArrayList<>();
tagArray = new ArrayList<>();
while(!c.isAfterLast()){
if(c.getString(c.getColumnIndex("name")) != null){
nameArray.add(i, c.getString(c.getColumnIndex("name")));
tagArray.add(i, c.getString(c.getColumnIndex("tag")));
}
c.moveToNext();
i++;
}
c.close();
db.close();
return nameArray;
}
public ArrayList<String> tagArrayMethod() {
stuffLinksNameArrayMethod();
return tagArray;
}
public float stuffTableSize(){
SQLiteDatabase db;
db = getReadableDatabase();
float amount = DatabaseUtils.queryNumEntries(db, TABLE_LinkTable);
db.close();
return amount;
}
}
GeneralSettingsFragment
package com.example.fragments.Settings;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import com.example.fragments.MainFragments.DialogFragments.GeneralSettingsInitialInputDialog;
import com.example.fragments.MainFragments.VariableFragments.GeneralSettingsEmptyFragment;
import com.example.fragments.MainFragments.VariableFragments.GeneralSettingsVariableFragment;
import com.example.fragments.MainFragments.VariableFragments.StuffManagerVariableFragment;
import com.example.tim.timapp.DBHandler;
import com.example.tim.timapp.MainActivity;
import com.example.tim.timapp.R;
import java.util.ArrayList;
public class GeneralSettingsFragment extends Fragment {
DBHandler dbHandler;
MainActivity ma = new MainActivity();
private static Menu optionsMenu;
public static boolean hideDeleteAllButton = false;
LinearLayout linearLayout;
View rootView;
#Override
public void onCreate(Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
#Nullable
#Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_generalsettings, container, false);
linearLayout = (LinearLayout) rootView.findViewById(R.id.FragmentContainerGeneralSettings);
if (linearLayout == null) {
Log.e("GMF", "Layout is null");
} else if (linearLayout.getChildCount() == 0) {
GeneralSettingsInitialInputDialog GSIID = new GeneralSettingsInitialInputDialog();
GSIID.show(getFragmentManager(), "dialog");
hideDeleteAllButton = true;
} else {
hideDeleteAllButton = false;
}
ma.DrawVariableFragments("GeneralSettings", "draw");
return rootView;
}
#Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.stuffmanager_actionbuttons, menu);
optionsMenu = menu;
}
#Override
public void onPrepareOptionsMenu(Menu menu) {
optionsMenu.findItem(R.id.removeAllButton).setVisible(!hideDeleteAllButton);
super.onPrepareOptionsMenu(menu);
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.addButton:
GeneralSettingsInitialInputDialog GSIID = new GeneralSettingsInitialInputDialog();
GSIID.show(getFragmentManager(), "dialog");
return true;
case R.id.removeAllButton:
dbHandler = DBHandler.getInstance(getActivity());
final ArrayList<String> nameArray = dbHandler.settingsNameArrayMethod();
final FragmentManager fm = getFragmentManager();
AlertDialog.Builder removeAllDialog = new AlertDialog.Builder(getActivity())
.setTitle("Delete all?")
.setMessage("Are you sure you want to delete all your devices? This is irreversible.")
.setIcon(R.drawable.ic_delete_black)
.setPositiveButton("Delete", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
dbHandler.deleteAllSettings();
for (String name : nameArray){
fm.beginTransaction().remove(fm.findFragmentByTag(name)).commit();
}
fm.executePendingTransactions();
// TODO: 30-Mar-16 Add "No devices created" screen like stuffmanager
hideDeleteAllButton = true;
getActivity().invalidateOptionsMenu();
}
})
.setNegativeButton("Cancel", null);
removeAllDialog.show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
MainActivity ma = new MainActivity();
This isn't valid in Android. You can't create an instance of an Activity like this because it isn't actually attached to the Android processes. This instance of MainActivity isn't going to step through any of the lifecycle methods, which is why you're seeing the error that the activity has been stopped. It was never actually started.
Instead, remove this reference to MainActivity, as it's bad practice to keep references like this around in your fragment. Any time you need an instance of MainActivity inside a fragment, use the following example:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ...
MainActivity ma = (MainActivity) getActivity();
ma.DrawVariableFragments("GeneralSettings", "draw");
// ...
}
Related
Alright, So. I've been trying for the last couple of hours to display a database on a list view widget in android studio. I used this exact code in another project and it worked find, but now that I am trying to integrate it into this one, the app continuously crashes when ever I try to pull from the database. this includes the getLight Method and the getAllLight Method. I am at a complete lost here. Again, this code worked, idk why i am getting an error now. is there something wrong with my methods? is there something I can try?
package com.studios.primitive.safealwayz.ui.main.Light;
import com.studios.primitive.safealwayz.ui.main.Account.AccountModel;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class LightDatabaseHelper extends SQLiteOpenHelper {
public static final String LIGHTS = "LIGHTS";
public static final String COLUMN_LIGHTID = "LIGHTID";
public static final String COLUMN_USERNAME = "USERNAME";
public static final String COLUMN_LOCATION = "LOCATION";
public static final String COLUMN_STATUS = "STATUS";
public LightDatabaseHelper(#Nullable Context context) {
super(context, "lights.db", null, 1);
}
#Override
public void onCreate(SQLiteDatabase db) {
String createTableStatement = "CREATE TABLE " + LIGHTS + " (" + COLUMN_LIGHTID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_USERNAME + " TEXT, " + COLUMN_LOCATION + " TEXT, " + COLUMN_STATUS + " BOOL)";
db.execSQL(createTableStatement);
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public boolean addLight(LightModel light, AccountModel accountModel) {
SQLiteDatabase db = getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUMN_USERNAME, accountModel.getUserName());
cv.put(COLUMN_LOCATION, light.getLocation());
cv.put(COLUMN_STATUS, light.isActive());
long insert = db.insert(LIGHTS, null, cv);
return insert != -1;
}
public void changeLightStatus(LightModel light){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COLUMN_LIGHTID, light.getLightID());
cv.put(COLUMN_LOCATION,light.getLocation());
cv.put(COLUMN_USERNAME, light.getUsername());
cv.put(COLUMN_STATUS, light.isActive());
db.update(LIGHTS, cv, COLUMN_LIGHTID + " = ?", new String[] { String.valueOf(light.getLightID())});
}
public List<LightModel> getAllLights(AccountModel account){
List<LightModel> rtnList = new ArrayList<>();
String queryCommand = "SELECT * FROM " + LIGHTS +" WHERE " + COLUMN_USERNAME + " = " + "'"+account.getUserName()+"'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(queryCommand,null);
if(cursor.moveToFirst()){
do{
int LightID = cursor.getInt(0);
String username = cursor.getString(1);
String lightLocation = cursor.getString(2);
boolean lightStatus = cursor.getInt(3) == 1;
LightModel newLight = new LightModel(lightLocation, account);
newLight.setActive(lightStatus);
newLight.setLightID(LightID);
rtnList.add(newLight);
}while(cursor.moveToNext());
}else{
//returns an empty list
}
cursor.close();
db.close();
return rtnList;
}
public LightModel getLight(String id, String user){
LightModel light = new LightModel(user);
SQLiteDatabase db = this.getReadableDatabase();
String queryCommand = "SELECT * FROM " + LIGHTS + " WHERE "+ COLUMN_LIGHTID + " = "+ "'" + id +"'";
Cursor cursor = db.rawQuery(queryCommand,null);
if(cursor.moveToFirst()){
do{
int LightID = cursor.getInt(0);
String username = cursor.getString(1);
String location = cursor.getString(2);
boolean status = cursor.getInt(3) == 1? true: false;
light.setLightID(LightID);
light.setUsername(username);
light.setLocation(location);
light.setActive(status);
}while(cursor.moveToNext());
}else{
//returns an empty list
}
cursor.close();
db.close();
return light;
}
}
Here is the Activity Class
package com.studios.primitive.safealwayz;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import com.studios.primitive.safealwayz.ui.main.Account.AccountModel;
import com.studios.primitive.safealwayz.ui.main.Light.LightDatabaseHelper;
import com.studios.primitive.safealwayz.ui.main.Light.LightModel;
import java.util.List;
public class AccountLightActivity extends AppCompatActivity {
Button turn;
ListView listV;
EditText lightID;
ArrayAdapter<LightModel> lightArrayAdapter;
LightDatabaseHelper lightDatabaseHelper;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_account_light);
final AccountModel model = (AccountModel) getIntent().getSerializableExtra("obj");
turn = (Button) findViewById(R.id.turn_light);
listV = (ListView) findViewById(R.id.list_view);
lightID = (EditText) findViewById(R.id.light_id_input);
/*
lightArrayAdapter = new ArrayAdapter<LightModel>(AccountLightActivity.this, android.R.layout.simple_list_item_1,lightDatabaseHelper.getAllLights(model));
listV.setAdapter(lightArrayAdapter);
*/
turn.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
String lightInput = lightID.getText().toString();
Toast.makeText(AccountLightActivity.this, model.getUserName(), Toast.LENGTH_SHORT).show();
LightModel li = lightDatabaseHelper.getLight(lightInput, model.getUserName());
Toast.makeText(AccountLightActivity.this, li.toString(), Toast.LENGTH_SHORT).show();
/*
if (lightInput.isEmpty()) {
Toast.makeText(AccountLightActivity.this, "Please Choose a LightID", Toast.LENGTH_SHORT).show();
}else{
LightModel li = lightDatabaseHelper.getLight(lightInput, model.getUserName());
if(li.isActive()){
li.setActive(false);
}else{
li.setActive(true);
}
lightDatabaseHelper.changeLightStatus(li);
Toast.makeText(AccountLightActivity.this, li.toString() , Toast.LENGTH_SHORT).show();
lightArrayAdapter = new ArrayAdapter<LightModel>(AccountLightActivity.this, android.R.layout.simple_list_item_1,lightDatabaseHelper.getAllLights(model));
listV.setAdapter(lightArrayAdapter);
}
*/
}
});
}
}
and finally, here is the error I've been getting.
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.studios.primitive.safealwayz, PID: 2269
java.lang.NullPointerException
at com.studios.primitive.safealwayz.AccountLightActivity$1.onClick(AccountLightActivity.java:53)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
This question already has answers here:
What is a NullPointerException, and how do I fix it?
(12 answers)
Closed 3 years ago.
The logcat is here:
list view activity --> clicked item(admin_parents_item) ---> option selected EDIT (current activity)
When I click on my button to update/edit the database it crashes. Something is missing. How to fix this error?
03-08 06:44:57.163 11022-11022/edu.angelo.parentsportal E/AndroidRuntime: FATAL EXCEPTION: main
Process: edu.angelo.parentsportal, PID: 11022
java.lang.NullPointerException: Attempt to invoke virtual method 'void edu.angelo.parentsportal.DatabaseHelper.updateData(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String)' on a null object reference
at edu.angelo.parentsportal.Admin_Parents_Item_Edit$1.onClick(Admin_Parents_Item_Edit.java:63)
at android.view.View.performClick(View.java:4780)
at android.view.View$PerformClick.run(View.java:19866)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5254)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
admin_parent__item_edit.java (my current activity)
package edu.angelo.parentsportal;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
public class Admin_Parents_Item_Edit extends AppCompatActivity {
Button btn_update;
EditText ed_Name;
EditText ed_Surname;
EditText ed_Email;
EditText ed_Phone_Number;
EditText ed_Password;
String s_Id;
String s_Name;
String s_Surname;
String s_Email;
String s_Phone_Number;
String s_Password;
Integer getId;
DatabaseHelper databaseHelper;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin__parents__item__edit);
ed_Name = findViewById(R.id.ed_name_update);
ed_Surname = findViewById(R.id.ed_surname_update);
ed_Email = findViewById(R.id.ed_email_update);
ed_Phone_Number = findViewById(R.id.ed_PhoneNumber_update);
ed_Password = findViewById(R.id.ed_password_update);
Intent intent = getIntent();
s_Id = intent.getStringExtra("ID");
s_Name = intent.getStringExtra("Name");
s_Surname = intent.getStringExtra("Surname");
s_Email = intent.getStringExtra("Email Address");
s_Phone_Number = intent.getStringExtra("Phone number");
s_Password = intent.getStringExtra("Password");
getId = Integer.parseInt(s_Id);
ed_Name.setText(s_Name);
ed_Surname.setText(s_Surname);
ed_Email.setText(s_Email);
ed_Phone_Number.setText(s_Phone_Number);
ed_Password.setText(s_Password);
btn_update = findViewById(R.id.btn_admin_parent_update);
btn_update.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
databaseHelper.updateData(getId,
ed_Name.getText().toString(),
ed_Surname.getText().toString(),
ed_Email.getText().toString(),
ed_Phone_Number.getText().toString(),
ed_Password.getText().toString());
finish();
}
});
}
}
Admin_parent_Item (my previous activity)
package edu.angelo.parentsportal;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.EditText;
import android.widget.TextView;
public class Admin_Parents_Item extends AppCompatActivity {
TextView tv_Id;
TextView tv_Name;
TextView tv_Surname;
TextView tv_Email;
TextView tv_Phone_Number;
TextView tv_Password;
String s_Id;
String s_Name;
String s_Surname;
String s_Email;
String s_Phone_Number;
String s_Password;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin__parents__item);
tv_Id = findViewById(R.id.tv_id_info);
tv_Name = findViewById(R.id.tv_name_info);
tv_Surname = findViewById(R.id.tv_surname_info);
tv_Email = findViewById(R.id.tv_email_info);
tv_Phone_Number = findViewById(R.id.tv_PhoneNumber_info);
tv_Password = findViewById(R.id.tv_password_info);
Intent intent = getIntent();
if (intent != null) {
s_Id = intent.getStringExtra("ID");
s_Name = intent.getStringExtra("Name");
s_Surname = intent.getStringExtra("Surname");
s_Email = intent.getStringExtra("Email Address");
s_Phone_Number = intent.getStringExtra("Phone Number");
s_Password = intent.getStringExtra("Password");
}
tv_Id.setText(s_Id);
tv_Name.setText(s_Name);
tv_Surname.setText(s_Surname);
tv_Email.setText(s_Email);
tv_Phone_Number.setText(s_Phone_Number);
tv_Password.setText(s_Password);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.admin__parents_item, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
switch (id) {
case R.id.admin_parent_item_action_edit: {
Intent intent = new Intent(this, Admin_Parents_Item_Edit.class);
intent.putExtra("ID", s_Id);
intent.putExtra("Name", s_Name);
intent.putExtra("Surname", s_Surname);
intent.putExtra("Email Address", s_Email);
intent.putExtra("Phone number", s_Phone_Number);
intent.putExtra("Password", s_Password);
startActivity(intent);
finish();
break;
}
}
return super.onOptionsItemSelected(item);
}
}
DatabaseHelper.java
package edu.angelo.parentsportal;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
public class DatabaseHelper extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "Parents_Portal.db";
public static final String TABLE_NAME = "Parents_Table";
public static final String COL_0 = "ID";
public static final String COL_1 = "NAME";
public static final String COL_2 = "SURNAME";
public static final String COL_3 = "EMAIL_ADDRESS";
public static final String COL_4 = "PHONE_NUMBER";
public static final String COL_5 = "PASSWORD";
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, 1);
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table " + TABLE_NAME +"(ID INTEGER PRIMARY KEY
AUTOINCREMENT, NAME TEXT, SURNAME TEXT, EMAIL_ADDRESS TEXT, PHONE_NUMBER TEXT,
PASSWORD TEXT)");
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
onCreate(db);
}
public boolean insertData(String name, String surname, String email_address,
String phone_number, String password) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(COL_1, name);
contentValues.put(COL_2, surname);
contentValues.put(COL_3, email_address);
contentValues.put(COL_4, phone_number);
contentValues.put(COL_5, password);
long result = db.insert(TABLE_NAME, null, contentValues);
if (result == -1) {
return false;
}
else {
return true;
}
}
public Cursor getAllData() {
SQLiteDatabase db = this.getReadableDatabase();
Cursor result = db.rawQuery("select * from " + TABLE_NAME, null);
return result;
}
public ArrayList<ParentModel> getAllParentsData() {
ArrayList<ParentModel> list = new ArrayList<>();
String sql = "select * from " + TABLE_NAME;
SQLiteDatabase mydb = this.getWritableDatabase();
Cursor cursor = mydb.rawQuery(sql, null);
if (cursor.moveToFirst()) {
do {
ParentModel parentModel = new ParentModel();
parentModel.setID(cursor.getString(0));
parentModel.setName(cursor.getString(1));
parentModel.setSurname(cursor.getString(2));
parentModel.setEmail(cursor.getString(3));
parentModel.setPhone_number(cursor.getString(4));
parentModel.setPassword(cursor.getString(5));
list.add(parentModel);
}
while (cursor.moveToNext())
;
}
return list;
}
public void updateData(int id, String name, String surname, String email,
String phone_number, String password) {
ContentValues contentValues = new ContentValues();
String sql = "select * from " + TABLE_NAME;
SQLiteDatabase mydb = this.getWritableDatabase();
Cursor cursor = mydb.rawQuery(sql, null);
if (cursor.moveToFirst()) {
do {
contentValues.put(COL_1, name);
contentValues.put(COL_2, surname);
contentValues.put(COL_3, email);
contentValues.put(COL_4, phone_number);
contentValues.put(COL_5, password);
}
while (cursor.moveToNext());
}
mydb.update(TABLE_NAME, contentValues, COL_0 + "=" + id, null);
mydb.close();
}
}
Your databaseHelper is null. Initialize it in onCreate() like below.
DatabaseHelper databaseHelper;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin__parents__item__edit);
databaseHelper = new DatabaseHelper (this); // Add this line
.........................
I want all edit text content that I have saved in SQL to be displayed on the edit bills activity when I click on the list item, but I am only able to retrieve the name and display it again in the intent. Rather than saving another data it should update the record with the new data if I save the existing record another time in the editbills_activity. Here is my DBAdapter.java
package com.example.dhruv.bills;
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;
import android.util.Log;
public class DBAdapter {
public static final String KEY_ROWID = "id";
public static final String KEY_NAME = "name";
public static final String KEY_AMOUNT = "amount";
public static final String KEY_DUEDATE = "duedate";
private static final String TAG = "DBAdapter";
private static final String DATABASE_NAME = "billsdb";
private static final String DATABASE_TABLE = "bills";
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_CREATE =
"create table if not exists assignments (id integer primary key autoincrement, "
+ "name VARCHAR not null, amount VARCHAR, duedate date );";
// Replaces DATABASE_CREATE using the one source definition
private static final String TABLE_CREATE =
"CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE + "(" +
KEY_ROWID + " INTEGER PRIMARY KEY, " + // AUTOINCREMENT NOT REQD
KEY_NAME + " DATE NOT NULL, " +
KEY_AMOUNT + " VARCHAR ," +
KEY_DUEDATE + " DATE " +
")";
private final Context context;
private DatabaseHelper DBHelper;
private SQLiteDatabase db;
public DBAdapter(Context ctx)
{
this.context = ctx;
DBHelper = new DatabaseHelper(context);
}
private static class DatabaseHelper extends SQLiteOpenHelper
{
DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
#Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(TABLE_CREATE); // NO need to encapsulate in try clause
}
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS contacts"); //????????
db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE);
onCreate(db);
}
}
//---opens the database---
public DBAdapter open() throws SQLException
{
db = DBHelper.getWritableDatabase();
return this;
}
//---closes the database---
public void close()
{
DBHelper.close();
}
//---insert a record into the database---
public long insertRecord(String name, String amount, String duedate)
{
ContentValues initialValues = new ContentValues();
initialValues.put(KEY_NAME, name);
initialValues.put(KEY_AMOUNT, amount);
initialValues.put(KEY_DUEDATE, duedate);
//return db.insert(DATABASE_TABLE, null, initialValues);
// Will return NULL POINTER EXCEPTION as db isn't set
// Replaces commented out line
return DBHelper.getWritableDatabase().insert(DATABASE_TABLE,
null,
initialValues
);
}
//---deletes a particular record---
public boolean deleteContact(long rowId)
{
return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0;
}
//---retrieves all the records--- SEE FOLLOWING METHOD
public Cursor getAllRecords()
{SQLiteDatabase db = DBHelper.getWritableDatabase();
String query ="SELECT * FROM " + DATABASE_TABLE;
Cursor data = db.rawQuery(query,null);
return data;
}
//As per getAllRecords but using query convenience method
public Cursor getAllAsCursor() {
return DBHelper.getWritableDatabase().query(
DATABASE_TABLE,
null,null,null,null,null,null
);
}
public void deleteName(int id, String name){
SQLiteDatabase db = DBHelper.getWritableDatabase();
String query = "DELETE FROM " + DATABASE_TABLE + " WHERE "
+ KEY_ROWID + " = '" + id + "'" +
" AND " + KEY_NAME + " = '" + name + "'";
Log.d(TAG, "deleteName: query: " + query);
Log.d(TAG, "deleteName: Deleting " + name + " from database.");
db.execSQL(query);
}
public Cursor getItemID(String name) {
SQLiteDatabase db = DBHelper.getWritableDatabase();
String query = "SELECT " + KEY_ROWID + " FROM " + DATABASE_TABLE +
" WHERE " + KEY_NAME + " = '" + name + "'";
Cursor data = db.rawQuery(query, null);
return data;
}
//---retrieves a particular record--- THIS WILL NOT WORK - NO SUCH TABLE
/* public Cursor getRecord()
{String query1 ="SELECT * FROM" + KEY_TITLE;
Cursor mCursor = db.rawQuery(query1,null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}*/
// Retrieve a row (single) according to id
public Cursor getRecordById(long id) {
return DBHelper.getWritableDatabase().query(
DATABASE_TABLE,
null,
KEY_ROWID + "=?",
new String[]{String.valueOf(id)},
null,null,null
);
}
//---updates a record---
/* public boolean updateRecord(long rowId, String name, String amount, String duedate)
{
ContentValues args = new ContentValues();
args.put(KEY_NAME, name);
args.put(KEY_AMOUNT, amount);
args.put(KEY_DUEDATE, duedate);
String whereclause = KEY_ROWID + "=?";
String[] whereargs = new String[]{String.valueOf(rowId)};
// Will return NULL POINTER EXCEPTION as db isn't set
//return db.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0;
// Replaces commented out line
return DBHelper.getWritableDatabase().update(DATABASE_TABLE,
args,
whereclause,
whereargs
) > 0;
}*/
}
Here is my Bills.java (MainActivity)
Problem: Bills.java has the list view that shows the intent whenever the item in list view is clicked, but it does not put the amount and date or update the record. Instead it saves another record.
Solution: I want to retrieve it and display all (name ,amount,duedate) and instead of saving another record it should update it.
package com.example.dhruv.bill;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class bills extends AppCompatActivity {
DBAdapter dbAdapter;
ListView mrecycleview;
private static final String TAG ="assignments";
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bills);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mrecycleview =(ListView) findViewById(R.id.mRecycleView);
dbAdapter = new DBAdapter(this);
// mlistview();
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab1);
fab.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Intent i = new Intent(getApplicationContext(),Editbills.class);
startActivity(i);
}
});
mlistview();
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_bills, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private void mlistview(){
Log.d(TAG,"mlistview:Display data in listview");
Cursor mCursor = dbAdapter.getAllRecords();
ArrayList<String> listData = new ArrayList<>();
while (mCursor.moveToNext()){
listData.add(mCursor.getString(1));
}
ListAdapter adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,listData);
mrecycleview.setAdapter(adapter);
mrecycleview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
#Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
String name = adapterView.getItemAtPosition(i).toString();
Log.d(TAG, "onItemClick: You Clicked on " + name);
Cursor data = dbAdapter.getItemID(name); //get the id associated with that name
int itemID = -1;
while(data.moveToNext()){
itemID = data.getInt(0);
}
if(itemID > -1){
Log.d(TAG, "onItemClick: The ID is: " + itemID);
Intent editScreenIntent = new Intent(bills.this, Editbills.class);
editScreenIntent.putExtra("id",itemID);
editScreenIntent.putExtra("name",name);
startActivity(editScreenIntent);
}
else{
}
}
});
}
}
here is my editbills.java code
package com.example.dhruv.bill;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Editbills extends AppCompatActivity {
Button button;
private static final String Tag= "assignments";
DBAdapter db = new DBAdapter(this);
private String selectedName;
private int selectedID;
DBAdapter dbAdapter;
private EditText editText,editText2,editText3;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_editbills);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
button=(Button)findViewById(R.id.button);
editText =(EditText)findViewById(R.id.editText);
editText2=(EditText)findViewById(R.id.editText2);
editText3 =(EditText)findViewById(R.id.editText3);
//get the intent extra from the ListDataActivity
Intent receivedIntent = getIntent();
//now get the itemID we passed as an extra
selectedID = receivedIntent.getIntExtra("id",-1); //NOTE: -1 is just the default value
//now get the name we passed as an extra
selectedName = receivedIntent.getStringExtra("name");
//set the text to show the current selected name
editText.setText(selectedName);
button.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View view) {
Log.d("test", "adding");
db.open();
long id = db.insertRecord(editText.getText().toString(), editText2.getText().toString(), editText3.getText().toString());
db.close();
Toast.makeText(Editbills.this," Added", Toast.LENGTH_LONG).show();
Intent q = new Intent(getApplicationContext(),bills.class);
startActivity(q);
}
});
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_bills, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_Delete) {
db.deleteName(selectedID,selectedName);
editText.setText("");
Toast.makeText(this, "Deleted", Toast.LENGTH_SHORT).show();
Intent p = new Intent(getApplicationContext(),bills.class);
startActivity(p);
return true;
}
return super.onOptionsItemSelected(item);
}
}
Instead of
DBHelper.getWritableDatabase().insert(DATABASE_TABLE, null, initialValues);
in insertRecord function of DBHelper, it should be
DBHelper.getWritableDatabase().update("markers", valores, where, whereArgs);
In my case I have DbHandler.java,and ActivityKategori.java.
My problem is at DbHandler.java, I have query condition
SELECT * FROM TBL_**** WHERE COLUMN1 = 'VARIABEL_FROM_ACT_KATEGORI' "
and that is variable value is from bundle :D
I already make full of changes but nothing solved.
Here's the full code
ActivityKategori.java
This activity is get data from bundle and send it value to DBHandler to get sql CONDITION.
I know someone will suggest to using SharedPreference but im confused about it.
Right now, I want to learn passing using Bundle or Intents
package ptacs.ekatalog.com.e_katalogproduk.activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import ptacs.ekatalog.com.e_katalogproduk.R;
import ptacs.ekatalog.com.e_katalogproduk.adapter.KategoriAdapter;
import ptacs.ekatalog.com.e_katalogproduk.helper.Constant;
import ptacs.ekatalog.com.e_katalogproduk.helper.DBHandler;
import ptacs.ekatalog.com.e_katalogproduk.helper.RecyclerItemClickListener;
import ptacs.ekatalog.com.e_katalogproduk.model.Produk;
public class ActivityKategori extends AppCompatActivity {
private SwipeRefreshLayout swLayout2;
private LinearLayout llayout2;
private RecyclerView recyclerView;
private LinearLayoutManager layoutManager;
private KategoriAdapter adapter;
private DBHandler dbHandler;
private List<Produk> kategoriList = new ArrayList<>();
private TextView tv1;
String mMerkProduk;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_kategori);
initRecyclerView();
cekDataRecyclerView();
if (getIntent().getExtras() != null) {
Bundle bundle = getIntent().getExtras();
mMerkProduk = bundle.getString(Constant.BUNDLE_MERK_PRODUK); //MERK kategori
//Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setTitle(mMerkProduk);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
dbHandler = new DBHandler(this);
}
//dbHandler.getKategoryProduk(mMerkProduk);
}
private void initRecyclerView(){
recyclerView = (RecyclerView) findViewById(R.id.rv_kategori);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
dbHandler = new DBHandler(ActivityKategori.this);
kategoriList = dbHandler.getKategoryProduk(mMerkProduk); //GET VALUE STRING
//kategoriList = dbHandler.getKategoryProduk(); //OLD CODE to GET OBJECT
adapter = new KategoriAdapter(kategoriList);
recyclerView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
private void cekDataRecyclerView() {
if (adapter.getItemCount() == 0) {
recyclerView.setVisibility(View.GONE);
} else {
recyclerView.setVisibility(View.VISIBLE);
recyclerView.addOnItemTouchListener(
new RecyclerItemClickListener(getApplicationContext(), new RecyclerItemClickListener.OnItemClickListener() {
#Override
public void onItemClick(View view, int position) {
// TODO Handle item click
Bundle bundle = new Bundle();
//COMMIT MAS INDRA CS
bundle.putString(Constant.BUNDLE_JENIS_PRODUK, adapter.getItem(position).getJenis_produk());
Intent intent = new Intent(ActivityKategori.this, ActivityList.class);
intent.putExtras(bundle);
startActivity(intent);
}
})
);
}
swLayout2 = (SwipeRefreshLayout) findViewById(R.id.sw_layout2);
llayout2 = (LinearLayout) findViewById(R.id.ll_Layout);
//Mengeset warna yang berputar
swLayout2.setColorSchemeResources(R.color.colorAccent,R.color.colorPrimary);
//Setting Listener yang akan dijalankan saat layar difresh
swLayout2.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
#Override
public void onRefresh() {
refreshItem();
}
void refreshItem(){
initRecyclerView();
cekDataRecyclerView();
onItemLoad();
}
void onItemLoad(){
swLayout2.setRefreshing(false);
}
});
}
}
ActivityKategori.java
package ptacs.ekatalog.com.e_katalogproduk.helper;
/**
* Created by Maxoto on 1/15/2018.
*/
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import java.util.ArrayList;
import java.util.List;
import ptacs.ekatalog.com.e_katalogproduk.model.Produk;
public class DBHandler extends SQLiteOpenHelper {
private static final int DATABASE_VERSION = 2;
private static final String DATABASE_NAME = "db_ekatalog"; // NAMA DATABASE
private static final String TABLE_PRODUK = "tb_produk"; // NAMA TABEL
private static final String COLUMN_ID = "id_produk"; // NAMA KOLOM ID
private static final String COLUMN_KD = "kd_produk"; // KODE PRODUK
private static final String COLUMN_NAMA = "nama_produk"; // NAMA KOLOM NAMA
private static final String COLUMN_MERK = "merk_produk"; //MERK PRODUK
private static final String COLUMN_JENIS = "jenis_produk"; //JENIS PRODUK
private static final String COLUMN_VARIASI = "variasi_produk"; //VARIASI PRODUK
private static final String COLUMN_FOTO = "foto_produk"; // FOTO PRODUK
public DBHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
// TODO : LANJUT SECTION 2
// FUNGSI UNTUK MEMBUAT DATABASENYA
#Override
public void onCreate(SQLiteDatabase db) {
String CREATE_USER_TABLE = "CREATE TABLE "
+ TABLE_PRODUK +
"(" + COLUMN_ID + " INTEGER PRIMARY KEY,"
+ COLUMN_KD + " TEXT,"
+ COLUMN_NAMA + " TEXT, "
+ COLUMN_MERK + " TEXT, "
+ COLUMN_JENIS + " TEXT, "
+ COLUMN_VARIASI + " TEXT, "
+ COLUMN_FOTO + " TEXT" + ")";
db.execSQL(CREATE_USER_TABLE);
}
// FUNGSI UNTUK MENGECEK DATABASE ADA ATAU TIDAK.
#Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + TABLE_PRODUK);
onCreate(db);
}
// FUNGSI UNTUK TAMBAH DATA PRODUK
public void tambahProduk(Produk produk){
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_KD, produk.getKd_produk());
values.put(COLUMN_NAMA, produk.getNama_produk());
values.put(COLUMN_MERK, produk.getMerk_produk());
values.put(COLUMN_JENIS, produk.getJenis_produk());
values.put(COLUMN_VARIASI, produk.getVariasi_produk());
values.put(COLUMN_FOTO, produk.getFoto_produk());
db.insert(TABLE_PRODUK, null, values);
db.close();
}
// FUNGSI UNTUK AMBIL 1 DATA PRODUK
public Produk getProduk(int id_produk){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(TABLE_PRODUK, new String[]{COLUMN_ID, COLUMN_KD ,COLUMN_NAMA, COLUMN_MERK
,COLUMN_JENIS, COLUMN_VARIASI , COLUMN_FOTO },
COLUMN_ID + "=?", new String[]{String.valueOf(id_produk)}, null, null,null, null);
if (cursor != null)
cursor.moveToFirst();
Produk produk = new Produk(cursor.getString(1), cursor.getString(2),cursor.getString(3),
cursor.getString(4),cursor.getString(5),cursor.getString(6));
return produk;
}
// FUNGSI UNTUK AMBIL SEMUA DATA PRODUK
public List<Produk> getSemuaProduk(){
List<Produk> produkList = new ArrayList<>();
String selectQuery = " SELECT * FROM " + TABLE_PRODUK ;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()){
do {
Produk produk = new Produk(cursor.getString(1), cursor.getString(2),cursor.getString(3),
cursor.getString(4),cursor.getString(5),cursor.getString(6));
produkList.add(produk);
} while (cursor.moveToNext());
}
return produkList;
}
// FUNGSI MENGHITUNG ADA BEBERAPA DATA
public int getProdukCount(){
String countQuery = "SELECT * FROM " + TABLE_PRODUK;
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.rawQuery(countQuery, null);
cursor.close();
return cursor.getCount();
}
// FUNGSI UPDATE DATA PRODUK
public int updateDataProduk(Produk produk) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(COLUMN_KD, produk.getKd_produk());
values.put(COLUMN_NAMA, produk.getNama_produk());
values.put(COLUMN_MERK, produk.getMerk_produk());
values.put(COLUMN_JENIS, produk.getJenis_produk());
values.put(COLUMN_VARIASI, produk.getVariasi_produk());
values.put(COLUMN_FOTO, produk.getFoto_produk());
return db.update(TABLE_PRODUK, values, COLUMN_ID + " = ?",
new String[]{String.valueOf(produk.getId())});
}
// FUNGSI HAPUS DATA 1 PRODUK
public void hapusDataProduk(Produk produk) {
SQLiteDatabase db = this.getWritableDatabase();
db.delete(TABLE_PRODUK, COLUMN_ID + " = ?",
new String[]{String.valueOf(produk.getId())});
db.close();
}
// FUNGSI UNTUK MENGHAPUS SEMUA DATA PRODUK
public void hapusSemuaDataProduk(){
SQLiteDatabase db = this.getWritableDatabase();
db.execSQL("DELETE FROM " + TABLE_PRODUK);
}
//FUNGSI MENGAMBIL DATA WHERE DI ACTIVITY KATEGORY
public List<Produk> getKategoryProduk(String mMerkProduk) {
List<Produk> kategoriList = new ArrayList<>();
String selectQuery = "SELECT * FROM " + TABLE_PRODUK + " WHERE " + COLUMN_MERK + " =? " ;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery,new String[]{ mMerkProduk } );
if (cursor.moveToFirst()) {
do {
Produk kategori = new Produk(cursor.getString(1), cursor.getString(2), cursor.getString(3),
cursor.getString(4), cursor.getString(5), cursor.getString(6));
kategoriList.add(kategori);
} while (cursor.moveToNext());
}
return kategoriList;
}
}
Here's the error:
01-29 14:10:25.342 370-370/ptacs.ekatalog.com.e_katalogproduk E/AndroidRuntime: FATAL EXCEPTION: main
Process: ptacs.ekatalog.com.e_katalogproduk, PID: 370
java.lang.RuntimeException: Unable to start activity ComponentInfo{ptacs.ekatalog.com.e_katalogproduk/ptacs.ekatalog.com.e_katalogproduk.activity.ActivityKategori}: java.lang.IllegalArgumentException: the bind value at index 1 is null
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2308)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1285)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5235)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
at android.database.sqlite.SQLiteProgram.bindString(SQLiteProgram.java:164)
at android.database.sqlite.SQLiteProgram.bindAllArgsAsStrings(SQLiteProgram.java:200)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
at ptacs.ekatalog.com.e_katalogproduk.helper.DBHandler.getKategoryProduk(DBHandler.java:152)
at ptacs.ekatalog.com.e_katalogproduk.activity.ActivityKategori.initRecyclerView(ActivityKategori.java:68)
at ptacs.ekatalog.com.e_katalogproduk.activity.ActivityKategori.onCreate(ActivityKategori.java:43)
at android.app.Activity.performCreate(Activity.java:6001)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2261)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2368)
at android.app.ActivityThread.access$800(ActivityThread.java:144)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1285)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5235)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
01-29 14:10:25.364 370-370/? I/Process: Sending signal. PID: 370 SIG: 9
ACTIVITY_MENU
ACTIVITY_KATEGORI
You are calling initRecyclerView(); before you initialise mMerkProduk. So just call initRecyclerView(); after if (getIntent().getExtras() != null) {....} block. Just like this
if (getIntent().getExtras() != null) {
Bundle bundle = getIntent().getExtras();
mMerkProduk = bundle.getString(Constant.BUNDLE_MERK_PRODUK); //MERK kategori
//Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
setTitle(mMerkProduk);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
dbHandler = new DBHandler(this);
}
initRecyclerView();
cekDataRecyclerView();
As Logcat says
Caused by: java.lang.IllegalArgumentException: the bind value at index 1 is null
I think your mMerkProduk is null. Check mMerkProduk is null before query.
Check this answer. I think it's same case as yours.
variable value is from bundle
Not sure why that matters... Extract the value from the Bundle and use its value as a parameter to the database methods like any other value
You seem to already know how to use bundle.getString(), for example
If all you want is to see the data, your OnCreate should look like this.
Most importantly, you need to assign the value before you query the database and populate the list.
If you look at these lines of the error, then look at your code, the intent is not read yet, and your string is null
at ptacs.ekatalog.com.e_katalogproduk.helper.DBHandler.getKategoryProduk(DBHandler.java:152)
at ptacs.ekatalog.com.e_katalogproduk.activity.ActivityKategori.initRecyclerView(ActivityKategori.java:68)
Try instead separating the code that inits the list View object from the code the queries the database and populates the list
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_kategori);
dbHandler = new DBHandler(ActivityKategori.this);
//Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
initRecyclerView();
if (getIntent().getExtras() != null) {
Bundle bundle = getIntent().getExtras();
mMerkProduk = bundle.getString(Constant.BUNDLE_MERK_PRODUK);
setTitle(mMerkProduk);
fillRecyclerView(mMerkProduk);
}
// cekDataRecyclerView();
}
private void initRecyclerView(){
recyclerView = (RecyclerView) findViewById(R.id.rv_kategori);
recyclerView.setHasFixedSize(true);
layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
}
private void fillRecyclerView(String product) {
if (product!=null) {
kategoriList = dbHandler.getKategoryProduk(product);
adapter = new KategoriAdapter(kategoriList);
recyclerView.setAdapter(adapter);
}
}
I'm developing a contacts app with a photo. I have Store and retrieve data from SQLite and it's working fine on my list view.
The problem is when I click a list item from it's supposed to show an image view and few other details. but the image is not showing on the Activity
List View on Main Activity
In the empty space here should be an image of the contacts
UserDBHelper.java
package com.example.arif.contacts;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.util.Log;
public class UserDBHelper extends SQLiteOpenHelper {
String TAG = "DEBUG";
private static final String DATABASE_NAME = "USERINFO.DB";
private static final String TABLE_NAME = "ContactTable";
private static final String TABLE_COL_NAME = "NAME";
private static final String TABLE_COL_MOB = "MOB";
private static final String TABLE_COL_EMAIL = "EMAIL";
private static final String TABLE_COL_IMG = "EMAIL";
private static final String TABLE_COL_ID = "ID";
private static final int DATABASE_VERSION = 1;
private static final String CREATE_QUERY =
"CREATE TABLE "+TABLE_NAME+"("+TABLE_COL_ID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+TABLE_COL_NAME+" TEXT, "+TABLE_COL_MOB+" TEXT, "+TABLE_COL_EMAIL+" TEXT, "+TABLE_COL_IMG+" blob)" ;
public UserDBHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
Log.e("DataBase", "Database created / Opened");
}
#Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_QUERY);
Log.e("DataBase", "Table Created");
}
#Override
public void onUpgrade(SQLiteDatabase db, int i, int i1) {
}
public boolean AddInfo(String Name, String Mob , String Email, byte[] img )
{
SQLiteDatabase db = this.getWritableDatabase();
ContentValues CV = new ContentValues();
CV.put("NAME", Name);
CV.put("MOB", Mob);
CV.put("EMAIL", Email );
CV.put("NewImage", img);
long result = db.insert(TABLE_NAME, null,CV);
Log.e("DataBase", "Add Info Bug");
if(result == -1)
{
return false;
}
else
{
return true;
}
}
public Cursor getInformation()
{
Cursor data;
SQLiteDatabase db = this.getWritableDatabase();
String query = "Select * from " + TABLE_NAME;
data = db.rawQuery(query,null);
return data;
}
public String fetch_Name(int i)
{
String Str = "";
SQLiteDatabase db = this.getReadableDatabase();
String query = "Select "+TABLE_COL_NAME+" FROM " + TABLE_NAME + " WHERE " +TABLE_COL_ID+" = "+i;
Cursor data = db.rawQuery(query,null);
if(data.moveToFirst())
{
Str = data.getString(data.getColumnIndex(TABLE_COL_NAME+""));
}
return Str;
}
public String fetch_MOB(int i)
{
String Str = "";
SQLiteDatabase db = this.getReadableDatabase();
String query = "Select "+TABLE_COL_MOB+" FROM " + TABLE_NAME + " WHERE " +TABLE_COL_ID+" = "+i;
Cursor data = db.rawQuery(query,null);
if(data.moveToFirst())
{
Str = data.getString(data.getColumnIndex(TABLE_COL_MOB+""));
}
return Str;
}
public String fetch_Email(int i)
{
String Str = "";
SQLiteDatabase db = this.getReadableDatabase();
String query = "Select "+TABLE_COL_EMAIL+" FROM " + TABLE_NAME + " WHERE " +TABLE_COL_ID+" = "+i;
Cursor data = db.rawQuery(query,null);
if(data.moveToFirst())
{
Str = data.getString(data.getColumnIndex(TABLE_COL_EMAIL+""));
}
return Str;
}
public Bitmap fetch_Img(int i) { /// THIS FUNCTION IS NOT WORKING
byte[] ImgByte;
SQLiteDatabase db = this.getWritableDatabase();
String query = "Select "+TABLE_COL_IMG+" FROM " + TABLE_NAME + " WHERE " +TABLE_COL_ID+" = "+i;
Cursor data = db.rawQuery(query,null);
if(data.moveToFirst())
{
ImgByte = data.getBlob(data.getColumnIndex(TABLE_COL_IMG+""));
Bitmap bitMAP = BitmapFactory.decodeByteArray(ImgByte, 0, ImgByte.length); // Here it's Always Returning Null
if(bitMAP == null)
{
Log.e( TAG, "Bitmap is null :/ ");
}
return bitMAP;
}
return null;
}
}
DetailsViewActivity
package com.example.arif.contacts;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class DetailsOfContacts extends AppCompatActivity {
int Pos;
TextView Name_View, Mob_View, Email_View;
ImageView Image_View;
UserDBHelper userDBHelper;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_details_of_contacts);
//---- ---- Intend Bundle ---- ----
Intent intent = getIntent();
Bundle bundle = intent.getExtras();
Pos = -1;
if(bundle != null)
{
Pos = bundle.getInt("Position");
}
Toast.makeText(getApplicationContext(), "Position "+ Pos,Toast.LENGTH_SHORT).show();
// ---- ---- Find View ---- ----
Name_View = (TextView) findViewById(R.id.DetName);
Mob_View = (TextView) findViewById(R.id.DetMob);
Email_View = (TextView) findViewById(R.id.DetEmail);
Image_View = (ImageView) findViewById(R.id.DetImg);
/// --- --- DataBase -----
UserDBHelper userDBHelper = new UserDBHelper(getApplicationContext());
Name_View.setText(userDBHelper.fetch_Name(Pos+1)); // Working Fine
Mob_View.setText(userDBHelper.fetch_MOB(Pos+1));// Working Fine
Email_View.setText(userDBHelper.fetch_Email(Pos+1));// Working Fine
Image_View.setImageBitmap(userDBHelper.fetch_Img(Pos+1)); // it's Not showing The image in activity
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.edit_menu, menu);
return super.onCreateOptionsMenu(menu);
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
int id ;
id = item.getItemId();
if(id == R.id.EditButt)
{
Toast.makeText(getApplicationContext(),"Edit Button Clicked", Toast.LENGTH_SHORT).show();
Intent I = new Intent(DetailsOfContacts.this, EditActivity.class);
startActivity(I);
return true;
}
return super.onOptionsItemSelected(item);
}
}
09-18 09:35:56.866 26144-26144/com.example.arif.contacts E/DEBUG: Bitmap is null :/
Column name of image and email are same
private static final String TABLE_COL_EMAIL = "EMAIL";
private static final String TABLE_COL_IMG = "EMAIL";
Change column name of image.