简体   繁体   中英

Android database making error

I created a simple android application which asks for the users details such as name, blood type and contact number and stores it in a database. I deleted the database using the following code:

    /*Table was deleted*/
public void deleteProducts(){
    SQLiteDatabase db = getWritableDatabase();
    db.execSQL("DROP TABLE "+TABLE_PRODUCTS);
}

However when I now try and create a database I am getting an error.

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();
}

/*Table was deleted*/
public void deleteProducts(){
    SQLiteDatabase db = getWritableDatabase();
    db.execSQL("DROP TABLE "+TABLE_PRODUCTS);
}

//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 - Where the user enters the data and taps the save button which invokes the saveMe method

package com.example.androidsimpledbapp1;
import android.app.Activity;
import android.content.Intent;
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);
    //Setting EditTexts 
    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.fullname);
    //Setting DbHandler object 
    dbHandler = new MyDBHandler(this, null, null, 1);
}

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

    /*Sending Text To Main Activity*/
    String dbString = dbHandler.databaseToString();
    Intent myIntent = new Intent(v.getContext(),MainActivity.class);
    myIntent.putExtra("mytext",dbString);
    startActivity(myIntent);
    /*End of Sending to Main Activity*/
}

public void clearBtnPressed(View v){
    dbHandler.deleteProducts();
}
}

Log Cat Error

08-10 23:27:39.968: E/AndroidRuntime(356): FATAL EXCEPTION: main
08-10 23:27:39.968: E/AndroidRuntime(356): java.lang.IllegalStateException: Could not execute method of the activity
08-10 23:27:39.968: E/AndroidRuntime(356): at android.view.View$1.onClick(View.java:2144)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.view.View.performClick(View.java:2485)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.view.View$PerformClick.run(View.java:9080)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.os.Handler.handleCallback(Handler.java:587)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.os.Handler.dispatchMessage(Handler.java:92)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.os.Looper.loop(Looper.java:130)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.app.ActivityThread.main(ActivityThread.java:3683)
08-10 23:27:39.968: E/AndroidRuntime(356): at java.lang.reflect.Method.invokeNative(Native Method)
08-10 23:27:39.968: E/AndroidRuntime(356): at java.lang.reflect.Method.invoke(Method.java:507)
08-10 23:27:39.968: E/AndroidRuntime(356): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
08-10 23:27:39.968: E/AndroidRuntime(356): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
08-10 23:27:39.968: E/AndroidRuntime(356): at dalvik.system.NativeStart.main(Native Method)
08-10 23:27:39.968: E/AndroidRuntime(356): Caused by: java.lang.reflect.InvocationTargetException
08-10 23:27:39.968: E/AndroidRuntime(356): at java.lang.reflect.Method.invokeNative(Native Method)
08-10 23:27:39.968: E/AndroidRuntime(356): at java.lang.reflect.Method.invoke(Method.java:507)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.view.View$1.onClick(View.java:2139)
08-10 23:27:39.968: E/AndroidRuntime(356): ... 11 more
08-10 23:27:39.968: E/AndroidRuntime(356): Caused by: android.database.sqlite.SQLiteException: no such table: products: , while compiling: SELECT * FROM products WHERE 1
08-10 23:27:39.968: E/AndroidRuntime(356): at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356)
08-10 23:27:39.968: E/AndroidRuntime(356): at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1324)
08-10 23:27:39.968: E/AndroidRuntime(356): at com.example.androidsimpledbapp1.MyDBHandler.databaseToString(MyDBHandler.java:107)
08-10 23:27:39.968: E/AndroidRuntime(356): at com.example.androidsimpledbapp1.EditScreen.saveMe(EditScreen.java:60)
08-10 23:27:39.968: E/AndroidRuntime(356): ... 14 more

As you said, you dropped the table but never created it again. Since the database exists, onCreate() will not be called for you again unless you delete the database file. If you don't want to do that, simply call onCreate() yourself after you drop the table, or execute the CREATE TABLE statement again after dropping the table.

If you just want to empty the data in the table, you can do this instead:

db.delete(TABLE, null, null);

If you actually do want to delete the database file, you can use

SQLiteDatabase.deleteDatabase(filename);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM