2

誰でも助けてください。私は同じ問題を抱えている多くの人々を見て、すべての提案を見ましたが、それでもこれを機能させることはできません. アプリケーションをアンインストールして再度インストールしようとしました。バージョン番号を変更して、もう一度開始しようとしました。コードをデバッグしましたが、onCreate 関数に入りますが、選択クエリを作成しようとすると、users テーブルが存在しないと表示されます。どんな助けでも大歓迎です。みんなありがとう

DatabaseHandler クラス

public class DatabaseHandler extends SQLiteOpenHelper 
{   
    // Variables
    protected static final int DATABASE_VERSION = 1;            
    protected static final String DATABASE_NAME = "MyUser.db";

    // Constructor
    public DatabaseHandler(Context context) 
    { 
        super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    // Creating Tables 
    @Override
    public void onCreate(SQLiteDatabase db) 
    {           
        // Create the Users table
        // NOTE: I have the column variables saved above
        String CREATE_USERS_TABLE = "CREATE TABLE IF NOT EXISTS Users("
  + KEY_PRIMARY_ID + " " + INTEGER + " " + PRIMARY_KEY + " " + AUTO_INCREMENT + " " + NOT_NULL + "," + USERS_KEY_EMAIL + " " + NVARCHAR+"(1000)" + " " + UNIQUE + " " + NOT_NULL + "," + USERS_KEY_PIN + " " + NVARCHAR+"(10)" + " " + NOT_NULL + ")"; 
  db.execSQL(CREATE_USERS_TABLE);
    }

    // Upgrading database 
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
      db.execSQL("DROP TABLE IF EXISTS Users"); 
        onCreate(db); 
    }

UserDataSource クラス

public class UserDataSource 
{
    private SQLiteDatabase db;  
    private DatabaseHandler dbHandler;

    public UserDataSource(Context context) 
    {
        dbHandler = new DatabaseHandler(context);
    }

    public void OpenWriteable() throws SQLException 
    {
        db = dbHandler.getWritableDatabase();
    }

    public void Close() 
    {
        dbHandler.close();
    }

    // Validate the user login with the username and password provided
    public void ValidateLogin(String username, String pin) throws CustomException
    {   
         Cursor cursor = db.rawQuery(   "select * from Users where " + DatabaseHandler.USERS_KEY_EMAIL + " = '" + username + "'" + " and " + DatabaseHandler.USERS_KEY_PIN + " = '" + pin + "'" , null);

         ........
    }

それからアクティビティクラスで、私は電話しています

UserDataSource uds = new UserDataSource (this);
uds.OpenWriteable();
uds.ValidateLogin("name", "pin");

どんな助けでも素晴らしいでしょう、グラハムに感謝します

以下は、エラー レポートからの添付ログです。

11-23 17:47:46.414: I/SqliteDatabaseCpp(26717): sqlite returned: error code = 1, msg = no such table: Users, db=/data/data/prometric.myitemwriter/databases/MyUser.db
11-23 17:47:57.085: D/AndroidRuntime(26717): Shutting down VM
11-23 17:47:57.085: W/dalvikvm(26717): threadid=1: thread exiting with uncaught exception (group=0x40bec1f8)
11-23 17:47:57.171: D/dalvikvm(26717): GC_CONCURRENT freed 575K, 8% free 8649K/9351K, paused 2ms+6ms
11-23 17:47:57.179: E/AndroidRuntime(26717): FATAL EXCEPTION: main
11-23 17:47:57.179: E/AndroidRuntime(26717): java.lang.IllegalStateException: Could not execute method of the activity
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.view.View$1.onClick(View.java:3091)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.view.View.performClick(View.java:3558)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.view.View$PerformClick.run(View.java:14152)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.os.Handler.handleCallback(Handler.java:605)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.os.Handler.dispatchMessage(Handler.java:92)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.os.Looper.loop(Looper.java:137)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.app.ActivityThread.main(ActivityThread.java:4514)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at java.lang.reflect.Method.invokeNative(Native Method)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at java.lang.reflect.Method.invoke(Method.java:511)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at dalvik.system.NativeStart.main(Native Method)
11-23 17:47:57.179: E/AndroidRuntime(26717): Caused by: java.lang.reflect.InvocationTargetException
11-23 17:47:57.179: E/AndroidRuntime(26717):    at java.lang.reflect.Method.invokeNative(Native Method)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at java.lang.reflect.Method.invoke(Method.java:511)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.view.View$1.onClick(View.java:3086)
11-23 17:47:57.179: E/AndroidRuntime(26717):    ... 11 more
11-23 17:47:57.179: E/AndroidRuntime(26717): Caused by: android.database.sqlite.SQLiteException: no such table: Users: , while compiling: select * from Users where email = '' and pin = ''
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:143)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:127)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:94)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:53)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:47)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1685)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1659)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at projectname.database.UserDataSource.ValidateLogin(UserDataSource.java:73)
11-23 17:47:57.179: E/AndroidRuntime(26717):    at projectname.LoginActivity.btn_login_Click(LoginActivity.java:47)
11-23 17:47:57.179: E/AndroidRuntime(26717):    ... 14 more
4

5 に答える 5

3

CREATE_USERS_TABLEすべての変数を表示しているわけではありませんが、ステートメントに何か問題があると推測しています。それを整理して単純化しましょう。

"CREATE TABLE IF NOT EXISTS Users(" +
    KEY_PRIMARY_ID + " INTEGER PRIMARY KEY, " + 
    USERS_KEY_EMAIL + " NVARCHAR(1000) UNIQUE NOT NULL, " + 
    USERS_KEY_PIN + " NVARCHAR(10) NOT NULL)";

DATABASE_VERSIONに変更して、SQL スキーマを更新する必要があることをデータベースに伝える必要があります2


selectionArgsまた、クエリでパラメーターを使用して、SQL インジェクション攻撃から身を守る必要があります。

public void ValidateLogin(String username, String pin) throws CustomException
{   
     Cursor cursor = db.rawQuery(   "select * from Users where " + DatabaseHandler.USERS_KEY_EMAIL + " = ? and " + DatabaseHandler.USERS_KEY_PIN + " = ?", 
             new String[] {username, pin});

最後に、Java の命名規則に従い、すべてのメソッドを小文字で開始する必要があります: openWritable()close(),validateLogin()` など。

于 2012-11-23T17:47:45.150 に答える
3

助けてくれてありがとう。これが機能しなかった理由は、データベースの挿入がコミットされていなかったためです。以下は、誰かが興味を持っている場合に問題を回避する方法です。

// Create the Users table
db.beginTransaction();
try {
    Log.d(DatabaseHandler.class.getName(), "Creating table " + TABLE_USERS);
    String CREATE_USERS_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_USERS + "("
            + KEY_PRIMARY_ID + " " + INTEGER + " " + PRIMARY_KEY + ","
            + USERS_KEY_EMAIL + " " + NVARCHAR+"(1000)" + " " + UNIQUE + " " + NOT_NULL + ","
            + USERS_KEY_PIN + " " + NVARCHAR+"(10)" + " " + NOT_NULL + ");"; 
    db.execSQL(CREATE_USERS_TABLE);
    db.setTransactionSuccessful();
}
catch (SQLException e) {
    Log.e(DatabaseHandler.class.getName(), "Error Creating table " + TABLE_USERS + " ... " + e.getMessage());
    // Do whatever you want here
}
finally {
    db.endTransaction();
}
于 2012-11-26T15:56:21.737 に答える
0

クラスではUserDataSource、データベースを閉じた後にデータを選択しようとしています。それはdatabase_close()メソッドを書いた後です。したがって、データベース自体を閉じた後、データを選択しようとしています。それが問題の理由だと思います。そしてdatabase_versionUserDataSourceクラス内のイベントを更新することを検討してください。この両方を試してみてください。お役に立てれば。

于 2012-11-24T15:18:56.617 に答える
0

に変更する protected static final int DATABASE_VERSION = 1;protected static final int DATABASE_VERSION = 2; 、例外が解決されます。

于 2012-11-23T18:19:05.307 に答える
0

この方法では:

public void ValidateLogin(String username, String pin) throws CustomException
{   
     Cursor cursor = db.rawQuery("select * from Users where " +
     DatabaseHandler.USERS_KEY_EMAIL + " = '" + username + "'" + " and " +
     DatabaseHandler.USERS_KEY_PIN + " = '" + pin + "'" , null);
     ........
}

コードを次のように置き換えます

 Cursor cursor = db.rawQuery("select * from Users where"
 +DatabaseHandler.USERS_KEY_EMAIL+"='"+username+"'"+"and"+ 
 DatabaseHandler.USERS_KEY_PIN +"='"+pin+"'", null);

余分なスペースが重要だと思います。試してみてください。うまくいくことを願っています。解決策があれば教えてください。

于 2012-11-24T17:01:42.053 に答える