android.database.sqlite.SQLiteException:没有这样的表:(代码1)

时间:2015-11-16 18:52:49

标签: android sqlite android-sqlite sqliteopenhelper

您好,经过三天的浏览,调试我找不到错误的原因

我使用SQLite DB Browser扩展创建数据库 - firefox 我添加了我的资产(但它在ndroid工作室的数据库名称左侧的图标中显示了一个问号。)

经过几天的浏览后,我尝试更改版本,更改数据库名称,扩展名,尝试将“ this.getReadableDatabase(); ”更改为“ this.getWriteableDatabase(); “反之亦然..

但我仍然得到上述错误,有人指导我。

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jalil.justquiz/com.jalil.justquiz.MainActivity}: android.database.sqlite.SQLiteException: no such table: quiz_title (code 1): , while compiling: SELECT DISTINCT quiz_title FROM quiz_title WHERE _id = 1

我的databaseHelper:

    package com.jalil.justquiz;

   import java.io.File;
   import java.io.FileOutputStream;
   import java.io.IOException;
   import java.io.InputStream;
   import java.io.OutputStream;

   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.SQLiteException;
   import android.database.sqlite.SQLiteOpenHelper;

   /*
    * Created by Jalil on 14-11-2015.
    */
   public class DatabaseOpenHelper extends SQLiteOpenHelper{
public static String DATABASE_NAME = "";
private static final int DATABASE_VERSION = 3;

private static final String QUIZ_USER_DETAILS_TABLE = "quiz_user_details";
private static final String COLUMN_USERCOUNT = "User_Count";
private static final String COLUMN_USERNAME = "User_Name";
private static final String COLUMN_USRID = "User_Id";
private static final String COLUMN_USERSCORE = "User_Score";

private static final String QUIZ_TITLE_TABLE = "quiz_title";
private static final String COLUMN_QUIZTITLEID = "_id";
private static final String COLUMN_QUIZTITLE = "quiz_title";


private static final String QUIZ_QUESTION_TABLE = "quiz_question";
private static final String COLUMN_QUESTION_ID = "_id";
private static final String COLUMN_QUESTION_TITLE_ID = "quiz_title_id";
private static final String COLUMN_QUESTION = "quiz_question";
private static final String COLUMN_QUESTION_ANSWERED = "quiz_question_answered";
private static final String COLUMN_QUESTION_ANSWERED_CORRECT = "quiz_question_answered_correct";


private static final String QUIZ_OPTION_TABLE = "quiz_option";
private static final String COLUMN_OPTION_ID = "_id";
private static final String COLUMN_OPTION_QUESTION_ID = "quiz_question_id";
private static final String COLUMN_OPTION_1 = "quiz_option_1";
private static final String COLUMN_OPTION_2 = "quiz_option_2";
private static final String COLUMN_OPTION_3 = "quiz_option_3";
private static final String COLUMN_OPTION_4 = "quiz_option_4";
private static final String COLUMN_CORRECT_OPTION = "quiz_correct_option";


   //    private static final String QUIZ_USER_ANSWER_TABLE = "quiz_user_answer";
   //    private static final String QUIZ_USER_ANSWER__ID = "quiz_user_answer";
   //    private static final String QUIZ_USER_ANSWER__OPTION = "quiz_option_id";


private SQLiteDatabase database;

private final Context context;

// database path
private static String DATABASE_PATH;

/** constructor */
public DatabaseOpenHelper(Context ctx,String databaseName)  {
    super(ctx, databaseName, null, DATABASE_VERSION);
    DATABASE_NAME = databaseName;
    this.context = ctx;
    //DATABASE_PATH = context.getDatabasePath(DATABASE_NAME).getPath() ;
    DATABASE_PATH = context.getApplicationInfo().dataDir + "/databases/";
}

/**
 * Creates a empty database on the system and rewrites it with your own
 * database.
 * */
public void create() throws IOException {
    boolean dbExist = checkDataBase();

    if (dbExist) {
    } else {
        SQLiteDatabase db = this.getReadableDatabase();
        if (db.isOpen()){
            db.close();
        }
        try {
            copyDataBase();
        } catch (IOException e) {
            throw new Error("Error copying database");
        }
    }
}

/**
 * Check if the database already exist to avoid re-copying the file each
 * time you open the application.
 *
 * @return true if it exists, false if it doesn't
 */
private boolean checkDataBase() {
    SQLiteDatabase checkDB = null;

    try {
        String myPath = DATABASE_PATH + DATABASE_NAME;
        checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);

    } catch (SQLiteException e) {
        // database does't exist yet.
    }

    if (checkDB != null) {
        checkDB.close();
    }
    return checkDB != null ? true : false;
}

/**
 * Copies your database from your local assets-folder to the just created
 * empty database in the system folder, from where it can be accessed and
 * handled. This is done by transfering bytestream.
 * */
private void copyDataBase() throws IOException {

    // Open your local db as the input stream
    InputStream myInput = context.getAssets().open(DATABASE_NAME);

    // Path to the just created empty db
    String outFileName = DATABASE_PATH + DATABASE_NAME;

    // Open the empty db as the output stream
    OutputStream myOutput = new FileOutputStream(outFileName);

    // transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = myInput.read(buffer)) > 0) {
        myOutput.write(buffer, 0, length);
    }

    // Close the streams
    myOutput.flush();
    myOutput.close();
    myInput.close();

}

/** open the database */
public void open() throws SQLException {
    String myPath = DATABASE_PATH + DATABASE_NAME;
    database = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE);
}

/** close the database */
@Override
public synchronized void close() {
    if (database != null)
        database.close();
    super.close();
}

//region User Detail Table
// insert a user into the database
public long insert_QUIZ_USER_DETAILS(int usrCount, String usrName, int userId,int userScore) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(COLUMN_USERCOUNT, usrCount);
    initialValues.put(COLUMN_USERNAME, usrName);
    initialValues.put(COLUMN_USRID, userId);
    initialValues.put(COLUMN_USERSCORE, userScore);
    return database.insert(QUIZ_USER_DETAILS_TABLE, null, initialValues);
}

// updates a user
public boolean update_QUIZ_USER_DETAILS(int rowId,int usrCount, String usrName, int userId,int userScore) {
    ContentValues args = new ContentValues();
    args.put(COLUMN_USERCOUNT, usrCount);
    args.put(COLUMN_USERNAME, usrName);
    args.put(COLUMN_USRID, userId);
    args.put(COLUMN_USERSCORE, userScore);
    return database.update(QUIZ_USER_DETAILS_TABLE, args, COLUMN_USRID + "=" + rowId, null) > 0;
}

// retrieves a particular user
public Cursor get_QUIZ_USER_DETAILS(long rowId) throws SQLException {
    Cursor mCursor = database.query(true, QUIZ_USER_DETAILS_TABLE, new String[] {
                      COLUMN_USERNAME, COLUMN_USRID, COLUMN_USERSCORE },
   //                        COLUMN_USERCOUNT, COLUMN_USERNAME, COLUMN_USRID, COLUMN_USERSCORE },
            COLUMN_USRID + " = " + rowId, null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }

    return mCursor;
}

// delete a particular user
public boolean delete_SELECTED_QUIZ_USER_DETAILS(long rowId) {
    return database.delete(QUIZ_USER_DETAILS_TABLE, COLUMN_USRID + "=" + rowId, null) > 0;
}

// retrieves all users
public Cursor getAll_QUIZ_USER_DETAILS() {
    return database.query(QUIZ_USER_DETAILS_TABLE, new String[] {
                    COLUMN_USERNAME, COLUMN_USRID, COLUMN_USERSCORE }, null, null,
   //                COLUMN_USERCOUNT,COLUMN_USERNAME, COLUMN_USRID, COLUMN_USERSCORE }, null, null,
            null, null, null);
}
//endregion


//region Quiz Title
// insert a quiz title
public long insert_QUIZ_TITLE(int quizTitleId, String quizTitle) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(COLUMN_QUIZTITLEID, quizTitleId);
    initialValues.put(COLUMN_QUIZTITLE, quizTitle);
    return database.insert(QUIZ_TITLE_TABLE, null, initialValues);
}

// updates a quiz title
public boolean update_QUIZ_TITLE(int rowId,int quizTitleId, String quizTitle) {
    ContentValues args = new ContentValues();
    args.put(COLUMN_QUIZTITLEID, quizTitleId);
    args.put(COLUMN_QUIZTITLE, quizTitle);
    return database.update(QUIZ_TITLE_TABLE, args, COLUMN_QUIZTITLEID + "=" + rowId, null) > 0;
}

// retrieves a quiz title
public Cursor get_QUIZ_TITLE(long rowId) throws SQLException {
    Cursor mCursor = database.query(true, QUIZ_TITLE_TABLE, new String[] {
                    COLUMN_QUIZTITLE,  },
            COLUMN_QUIZTITLEID + " = " + rowId, null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }

    return mCursor;
}

// delete a particular quiz title
public boolean delete_SELECTED_QUIZ_TITLE(long rowId) {
    return database.delete(QUIZ_TITLE_TABLE, COLUMN_QUIZTITLEID + "=" + rowId, null) > 0;
}

// retrieves all quiz titles
public Cursor getAll_QUIZ_TITLE() {
    return database.query(QUIZ_TITLE_TABLE, new String[] { COLUMN_QUIZTITLE }, null, null,
            null, null, null);
}
//endregion


//region Quiz Question
// insert a quiz Question
public long insert_QUIZ_QUESTION_TABLE(int quizQuestionId,int quizQuestionTitleId, String quizQuestion,int quizAnswered,int quizAnsweredCorct) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(COLUMN_QUESTION_ID, quizQuestionId);
    initialValues.put(COLUMN_QUESTION_TITLE_ID, quizQuestionTitleId);
    initialValues.put(COLUMN_QUESTION, quizQuestion);
    initialValues.put(COLUMN_QUESTION_ANSWERED, quizAnswered);
    initialValues.put(COLUMN_QUESTION_ANSWERED_CORRECT, quizAnsweredCorct);
    return database.insert(QUIZ_QUESTION_TABLE, null, initialValues);
}

// updates a quiz Question
public boolean update_QUIZ_QUESTION_TABLE(long rowId,int quizQuestionId,int quizQuestionTitleId, String quizQuestion,int quizAnswered,int quizAnsweredCorct) {
    ContentValues args = new ContentValues();
    args.put(COLUMN_QUESTION_ID, quizQuestionId);
    args.put(COLUMN_QUESTION_TITLE_ID, quizQuestionId);
    args.put(COLUMN_QUESTION, quizQuestion);
    args.put(COLUMN_QUESTION_ANSWERED, quizAnswered);
    args.put(COLUMN_QUESTION_ANSWERED_CORRECT, quizAnsweredCorct);
    return database.update(QUIZ_QUESTION_TABLE, args, COLUMN_QUESTION_ID + "=" + rowId, null) > 0;
}

// retrieves a quiz Question
public Cursor get_QUIZ_QUESTION_TABLE(long rowId) throws SQLException {
    Cursor mCursor = database.query(true, QUIZ_QUESTION_TABLE, new String[] {
                    COLUMN_QUESTION_TITLE_ID,COLUMN_QUESTION,COLUMN_QUESTION_ANSWERED,COLUMN_QUESTION_ANSWERED_CORRECT  },
            COLUMN_QUESTION_ID + " = " + rowId, null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }

    return mCursor;
}

// delete a particular quiz Question
public boolean delete_SELECTED_QUIZ_QUESTION_TABLE(long rowId) {
    return database.delete(QUIZ_QUESTION_TABLE, COLUMN_QUESTION_ID + "=" + rowId, null) > 0;
}

// retrieves all quiz Questions
public Cursor getAll_QUIZ_QUESTION_TABLE() {
    return database.query(QUIZ_QUESTION_TABLE, new String[] { COLUMN_QUESTION }, null, null,
            null, null, null);
}
//endregion


//region Quiz Options
// insert quiz Options
public long insert_QUIZ_OPTION_TABLE(int quizOptionId,int quizQuestionId, String quizOption_1, String quizOption_2, String quizOption_3, String quizOption_4,int quizCorrectOption) {
    ContentValues initialValues = new ContentValues();
    initialValues.put(COLUMN_OPTION_ID, quizOptionId);
    initialValues.put(COLUMN_OPTION_QUESTION_ID, quizQuestionId);
    initialValues.put(COLUMN_OPTION_1, quizOption_1);
    initialValues.put(COLUMN_OPTION_2, quizOption_2);
    initialValues.put(COLUMN_OPTION_3, quizOption_3);
    initialValues.put(COLUMN_OPTION_4, quizOption_4);
    initialValues.put(COLUMN_CORRECT_OPTION, quizCorrectOption);
    return database.insert(QUIZ_OPTION_TABLE, null, initialValues);
}

// updates a quiz Options
public boolean update_QUIZ_OPTION_TABLE(long rowId, int quizOptionId,int quizQuestionId, String quizOption_1, String quizOption_2, String quizOption_3, String quizOption_4,int quizCorrectOption) {
    ContentValues args = new ContentValues();
    args.put(COLUMN_OPTION_ID, quizOptionId);
    args.put(COLUMN_OPTION_QUESTION_ID, quizQuestionId);
    args.put(COLUMN_OPTION_1, quizOption_1);
    args.put(COLUMN_OPTION_2, quizOption_2);
    args.put(COLUMN_OPTION_3, quizOption_3);
    args.put(COLUMN_OPTION_4, quizOption_4);
    args.put(COLUMN_CORRECT_OPTION, quizCorrectOption);
    return database.update(QUIZ_OPTION_TABLE, args, COLUMN_OPTION_ID + "=" + rowId, null) > 0;
}

// retrieves a quiz Options
public Cursor get_QUIZ_OPTION_TABLE(long rowId) throws SQLException {
    Cursor mCursor = database.query(true, QUIZ_OPTION_TABLE, new String[] {
                    COLUMN_OPTION_1,COLUMN_OPTION_2,COLUMN_OPTION_3, COLUMN_OPTION_4,COLUMN_CORRECT_OPTION  },
            COLUMN_OPTION_ID + " = " + rowId, null, null, null, null, null);
    if (mCursor != null) {
        mCursor.moveToFirst();
    }

    return mCursor;
}

// delete a particular quiz Option
public boolean delete_SELECTED_QUIZ_OPTION_TABLE(long rowId) {
    return database.delete(QUIZ_OPTION_TABLE, COLUMN_OPTION_ID + "=" + rowId, null) > 0;
}

// retrieves all quiz Option
public Cursor getAll_QUIZ_OPTION_TABLE() {
    return database.query(QUIZ_OPTION_TABLE, new String[] { COLUMN_QUESTION }, null, null,
            null, null, null);
}
//endregion


@Override
public void onCreate(SQLiteDatabase arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub

}

   }

我的主要活动:

   package com.jalil.justquiz;       
   import android.os.Bundle;
   import android.view.Menu;
   import android.view.MenuItem;

   import java.io.IOException;
   import android.widget.Toast;
   import android.app.Activity;
   import android.database.Cursor;
   import android.database.SQLException;

   public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    DatabaseOpenHelper myDbHelper = new DatabaseOpenHelper(this,"QUIZ_db.sqlite");
    try {
        // check if database exists in app path, if not copy it from assets
        myDbHelper.create();
    }
    catch(IOException ioe) {
        throw new Error("Unable to create database");
    }

    try {
        // open the database
        myDbHelper.open();
        myDbHelper.getWritableDatabase();
    } catch (SQLException sqle) {
        throw sqle;
    }

    // retrieve a particular question
    Cursor c = myDbHelper.get_QUIZ_TITLE(1);
    Toast.makeText(this, "id: " + c.getInt(0) , Toast.LENGTH_LONG).show();
    c.close();
}

@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_main, 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);
}

}

我的数据库:

enter image description here

我的Logcat:

    11-16 22:51:39.537  16947-16947/com.jalil.justquiz E/SQLiteLog﹕ (1) no such table: quiz_title
    11-16 22:51:39.577  16947-16947/com.jalil.justquiz E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.jalil.justquiz, PID: 16947
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.jalil.justquiz/com.jalil.justquiz.MainActivity}: android.database.sqlite.SQLiteException: no such table: quiz_title (code 1): , while compiling: SELECT DISTINCT quiz_title FROM quiz_title WHERE _id = 1
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        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:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: android.database.sqlite.SQLiteException: no such table: quiz_title (code 1): , while compiling: SELECT DISTINCT quiz_title FROM quiz_title WHERE _id = 1
        at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
        at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
        at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
        at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
        at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
        at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
        at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
        at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
        at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1161)
        at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1032)
        at com.jalil.justquiz.DatabaseOpenHelper.get_QUIZ_TITLE(DatabaseOpenHelper.java:230)
        at com.jalil.justquiz.MainActivity.onCreate(MainActivity.java:37)
        at android.app.Activity.performCreate(Activity.java:5231)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
        at android.app.ActivityThread.access$800(ActivityThread.java:135)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:136)
        at android.app.ActivityThread.main(ActivityThread.java:5017)
        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:779)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
        at dalvik.system.NativeStart.main(Native Method)

谢谢。

UPDATE:从DDMS打开数据库时,似乎只有android_metadata表格存在于数据库中。因此显示没有这样的表,但为什么'assets'文件夹中的数据库表被复制到'/ databases'文件夹中的数据库

0 个答案:

没有答案