This question already has an answer here:
I have created a very simple android application which asks for the users emergency details such as name, blood type, contact information and stores in a database. It then displays the information on a different activity. This is all supposed to happen once the user taps the save button. However the app seems to crash when the saveMe() function is invoked e.g. when the save button is pressed. Nothing is being saved in the database either. There is no data persistence the app simply crashes.
Database Class
package com.example.androidsimpledbapp1;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.Cursor;
import android.content.Context;
import android.content.ContentValues;
public class MyDBHandler extends SQLiteOpenHelper {
/*
* Class for Working with DB
*/
//Update each time DB structure changes e.g. adding new property
private static final int DATABASE_VERSION =1;
//DB Name
private static final String DATABASE_NAME = "deets.db";
//Table name
public static final String TABLE_PRODUCTS = "products";
//DB Columns
public static final String COLUMN_ID = "_Id";
public static final String COLUMN_PERSONNAME = "firstName";
public static final String COLUMN_PERSONBLOOD = "bloodType";
public static final String COLUMN_PERSONCONTACT = "contactName";
public static final String COLUMN_PERSONNUMBER = "phoneNumber";
public static final String COLUMN_PERSONRELATION = "relationship";
//Constructor
/*
* Passing information to super class in SQL
* Context is background information
* name of db
* Database version
*/
public MyDBHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
/*
* What to do first time when you create DB
* Creates the table the very first time
* (non-Javadoc)
* @see android.database.sqlite.SQLiteOpenHelper#onCreate(android.database.sqlite.SQLiteDatabase)
* Remember to use Commas as shown below
*/
@Override
public void onCreate(SQLiteDatabase db){
String query = "CREATE TABLE "+ TABLE_PRODUCTS + "(" +
COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "+
COLUMN_PERSONNAME + " TEXT, "+
COLUMN_PERSONBLOOD + " TEXT, "+
COLUMN_PERSONCONTACT + " TEXT, "+
COLUMN_PERSONNUMBER + " TEXT, " +
COLUMN_PERSONRELATION + " TEXT " +
");";
//Execute the query
db.execSQL(query);
}
/*
* If ever upgrading DB call this method
* (non-Javadoc)
* @see android.database.sqlite.SQLiteOpenHelper#onUpgrade(android.database.sqlite.SQLiteDatabase, int, int)
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
//Delete the current table
db.execSQL("DROP TABLE IF EXISTS" + TABLE_PRODUCTS);
//create new table
onCreate(db);
}
//Add new row to the database
public void addProduct(Details details){
//Built in class - set values for different columns
//Makes inserting rows quick and easy
ContentValues values = new ContentValues();
values.put(COLUMN_PERSONNAME, details.get_firstName());
values.put(COLUMN_PERSONBLOOD, details.get_bloodType());
values.put(COLUMN_PERSONCONTACT, details.get_contactName());
values.put(COLUMN_PERSONNUMBER, details.get_phoneNumber());
values.put(COLUMN_PERSONRELATION, details.get_relationship());
SQLiteDatabase db = getWritableDatabase();
db.insert(TABLE_PRODUCTS, null, values);
db.close();
}
/*
public void deleteProducts(){
SQLiteDatabase = getWritableDatabase();
db.execSQL("DROP TABLE");
How to delete the database...
}
*/
//Take DB and Convert to String
public String databaseToString(){
String dbString = "";
SQLiteDatabase db = getWritableDatabase();
//Every Column and row
String query = "SELECT * FROM " + TABLE_PRODUCTS + " WHERE 1";
//Cursor points to a location in your results
//First row point here, second row point here
Cursor c = db.rawQuery(query, null);
c.moveToFirst();
while(!c.isAfterLast()){
//Extracts first name and adds to string
if(c.getString(c.getColumnIndex("firstName"))!=null){
dbString += c.getString(c.getColumnIndex("firstName"));
c.moveToNext();
/*
* Displaying all other columns
*/
}
}
db.close();
return dbString;
}
}
Details Class
package com.example.androidsimpledbapp1;
public class Details {
//primary key
private int _id;
//Properties
private String _firstName;
private String _bloodType;
private String _contactName;
private String _phoneNumber;
private String _relationship;
//Dont Have to Enter Everything each time
public Details(){
}
public Details(String firstName){
this.set_firstName(firstName);
}
//Passing in details
//Setting values from the user
public Details(String firstName, String bloodType,
String contactName, String phoneNumber,
String relationship){
this.set_firstName(firstName);
this.set_bloodType(bloodType);
this.set_contactName(contactName);
this.set_phoneNumber(phoneNumber);
this.set_relationship(relationship);
}
//Retrieve the data
public int get_id() {
return _id;
}
//Setter allows to give property
public void set_id(int _id) {
this._id = _id;
}
public String get_firstName() {
return _firstName;
}
public void set_firstName(String _firstName) {
this._firstName = _firstName;
}
public String get_bloodType() {
return _bloodType;
}
public void set_bloodType(String _bloodType) {
this._bloodType = _bloodType;
}
public String get_contactName() {
return _contactName;
}
public void set_contactName(String _contactName) {
this._contactName = _contactName;
}
public String get_phoneNumber() {
return _phoneNumber;
}
public void set_phoneNumber(String _phoneNumber) {
this._phoneNumber = _phoneNumber;
}
public String get_relationship() {
return _relationship;
}
public void set_relationship(String _relationship) {
this._relationship = _relationship;
}
}
Edit Screen - The screen where the user enters the data in the edit text and taps the save button
package com.example.androidsimpledbapp1;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class EditScreen extends Activity {
EditText firstNameInput;
EditText bloodTypeInput;
EditText contacNameInput;
EditText phoneNumberInput;
EditText relationshipInput;
TextView displayName;
MyDBHandler dbHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_edit_screen);
firstNameInput = (EditText) findViewById(R.id.inputname);
bloodTypeInput = (EditText) findViewById(R.id.inputblood);
contacNameInput = (EditText) findViewById(R.id.inputcontact);
phoneNumberInput = (EditText) findViewById(R.id.inputnum);
relationshipInput = (EditText) findViewById(R.id.inputraltion);
displayName = (TextView) findViewById(R.id.dbname);
dbHandler = new MyDBHandler(this, null, null, 1);
}
/*
* Causing error fix the error
*/
public void saveMe(View v){
//Making a new object
//Object takes 5 parameters
Details detail = new Details(firstNameInput.getText().toString()
,
bloodTypeInput.getText().toString(),
contacNameInput.getText().toString(),
phoneNumberInput.getText().toString(),
relationshipInput.getText().toString()
);
dbHandler.addProduct(detail);
// printDatabase();
}
private void printDatabase() {
//Taking the string
String dbString = dbHandler.databaseToString();
//Display in the textview
displayName.setText(dbString);
}
}
MainActivity - The screen where everything is displayed in the text view
package com.example.androidsimpledbapp1;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//Changing Activity
public void editBtnPressed(View v){
Intent intent = new Intent(MainActivity.this, EditScreen.class);
startActivity(intent);
}
}
Log Cat Error
08-10 21:54:55.404: E/AndroidRuntime(398): FATAL EXCEPTION: main 08-10 21:54:55.404: E/AndroidRuntime(398): java.lang.IllegalStateException: Could not execute method of the activity 08-10 21:54:55.404: E/AndroidRuntime(398): at android.view.View$1.onClick(View.java:2144) 08-10 21:54:55.404: E/AndroidRuntime(398): at android.view.View.performClick(View.java:2485) 08-10 21:54:55.404: E/AndroidRuntime(398): at android.view.View$PerformClick.run(View.java:9080) 08-10 21:54:55.404: E/AndroidRuntime(398): at android.os.Handler.handleCallback(Handler.java:587) 08-10 21:54:55.404: E/AndroidRuntime(398): at android.os.Handler.dispatchMessage(Handler.java:92) 08-10 21:54:55.404: E/AndroidRuntime(398): at android.os.Looper.loop(Looper.java:130) 08-10 21:54:55.404: E/AndroidRuntime(398): at android.app.ActivityThread.main(ActivityThread.java:3683) 08-10 21:54:55.404: E/AndroidRuntime(398): at java.lang.reflect.Method.invokeNative(Native Method) 08-10 21:54:55.404: E/AndroidRuntime(398): at java.lang.reflect.Method.invoke(Method.java:507) 08-10 21:54:55.404: E/AndroidRuntime(398): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 08-10 21:54:55.404: E/AndroidRuntime(398): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 08-10 21:54:55.404: E/AndroidRuntime(398): at dalvik.system.NativeStart.main(Native Method) 08-10 21:54:55.404: E/AndroidRuntime(398): Caused by: java.lang.reflect.InvocationTargetException 08-10 21:54:55.404: E/AndroidRuntime(398): at java.lang.reflect.Method.invokeNative(Native Method) 08-10 21:54:55.404: E/AndroidRuntime(398): at java.lang.reflect.Method.invoke(Method.java:507) 08-10 21:54:55.404: E/AndroidRuntime(398): at android.view.View$1.onClick(View.java:2139) 08-10 21:54:55.404: E/AndroidRuntime(398): ... 11 more 08-10 21:54:55.404: E/AndroidRuntime(398): Caused by: java.lang.NullPointerException 08-10 21:54:55.404: E/AndroidRuntime(398): at com.example.androidsimpledbapp1.EditScreen.printDatabase(EditScreen.java:58) 08-10 21:54:55.404: E/AndroidRuntime(398): at com.example.androidsimpledbapp1.EditScreen.saveMe(EditScreen.java:51) 08-10 21:54:55.404: E/AndroidRuntime(398): ... 14 more
Aucun commentaire:
Enregistrer un commentaire