Android SQLite用户登录不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android SQLite用户登录不起作用相关的知识,希望对你有一定的参考价值。

我实际上在我的应用程序中实现了一个SQLite数据库并进行了一个Login活动。因此,当应用程序启动时,我启动我的登录活动,并在那里我访问数据库。因此,用户输入名称和密码并按“anmelden”,然后数据库检查用户是否已经存在,如果是,则密码是否正确,如果正确,则活动结束,用户可以继续。如果密码不正确但用户存在,则不会发生任何事情,并且将显示Toast。如果没有给出Name的用户,则将使用该Password和Name创建一个新用户。

我的问题是,当我创建一个新用户时,一切似乎工作正常,但如果我重新启动应用程序并尝试使用相同的数据登录,它仍然会创建一个新用户。

我遗憾地不知道这在数据库中看起来怎么样因为我没有root电话atm,所以我希望你们能帮助我,因为我没有发现错误

这是我的“Anmeldung”(登录)课程

public class Anmeldung extends Activity {
public Datasource datasource = new Datasource(this);


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    setContentView(R.layout.activity_anmeldung);
}

//// OnClick-Methoden

/// public void anmelden(View view) {//the Login method

    EditText t = (EditText) findViewById(R.id.editText_username);
    String name = t.getText().toString();
    EditText e = (EditText) findViewById(R.id.editText_passwort);
    String psswd = e.getText().toString();
    datasource.open();
    if (datasource.UserExists(name)) {
        if (datasource.correctPassword(name, psswd)) {
            datasource.close();

            finish();
        } else {
            @SuppressLint("WrongConstant") Toast toast = Toast.makeText(getApplicationContext(), "Falsches Passwort", 3);
            toast.show();
        }
    } else {
        datasource.createUser(name, psswd, 0, 0);
        @SuppressLint("WrongConstant") Toast toast = Toast.makeText(getApplicationContext(), "Neuen Nutzer erstellt", 3);
        toast.show();

        finish();
    }


}

}

这是我的数据源类,包含所有相关方法

public class Datasource {
//Log-Tag
private static final String LOG_TAG = Datasource.class.getSimpleName();
//Datenbankspezifische Variablen
private SQLiteDatabase database;
private Datahelper dbHelper;
private String[] columns = {Datahelper.COLUMN_ID, Datahelper.COLUMN_TYPE, Datahelper.COLUMN_NAME, Datahelper.COLUMN_EXPIRATION, Datahelper.COLUMN_OWNER};
private String[] columns_users = {Datahelper.COLUMN_ID_USERS, Datahelper.COLUMN_NAME_USERS, Datahelper.COLUMN_PSSWD_USERS, Datahelper.COLUMN_SOAP_USERS, Datahelper.COLUMN_EP_USERS};
private String[] column_id_user = {Datahelper.COLUMN_ID_USERS};
private String[] column_name_user = {Datahelper.COLUMN_NAME_USERS};
private String[] column_psswd_user = {Datahelper.COLUMN_PSSWD_USERS};

//Konstruktor
public Datasource(Context context) {
    Log.d(LOG_TAG, "DataSource is now creating the dbHelper");
    dbHelper = new Datahelper(context);
}

//Öffnen der Datenbank
public void open() {
    Log.d(LOG_TAG, "asking for reference");
    database = dbHelper.getWritableDatabase();
    Log.d(LOG_TAG, "received reference. path: " + database.getPath());

}

//Schließen der Datenbank
public void close() {
    dbHelper.close();
    Log.d(LOG_TAG, "closed database");
}








public User createUser(String name, String psswd, long soap, long ep) {
    ContentValues c = new ContentValues();
    c.put(Datahelper.COLUMN_NAME_USERS, name);
    c.put(Datahelper.COLUMN_PSSWD_USERS, psswd);
    c.put(Datahelper.COLUMN_SOAP_USERS, soap);
    c.put(Datahelper.COLUMN_EP_USERS, ep);
    long insId = database.insert(Datahelper.TABLE_USERS, null, c);
    Cursor cursor = database.query(Datahelper.TABLE_USERS, columns_users, Datahelper.COLUMN_ID_USERS + "=" + insId, null, null, null, null);
    cursor.moveToLast();
    return cursorToUser(cursor);
}

private User cursorToUser(Cursor cursor) {

    int idId = cursor.getColumnIndex(Datahelper.COLUMN_ID_USERS);
    int idName = cursor.getColumnIndex(Datahelper.COLUMN_NAME_USERS);
    int idPsswd = cursor.getColumnIndex(Datahelper.COLUMN_PSSWD_USERS);
    int idSoap = cursor.getColumnIndex(Datahelper.COLUMN_SOAP_USERS);
    int idEp = cursor.getColumnIndex(Datahelper.COLUMN_EP_USERS);
    long id = cursor.getLong(idId);
    String name = cursor.getString(idName);
    String psswd = cursor.getString(idPsswd);
    long soap = cursor.getLong(idSoap);
    long ep = cursor.getLong(idEp);
    return new User(id, name, psswd, soap, ep);

}

public boolean UserExists(String name) {
    try {
        Cursor cursor = database.query(Datahelper.TABLE_USERS, column_id_user, Datahelper.COLUMN_NAME_USERS + " = " + name, null, null, null, null);
        long id = cursor.getLong(cursor.getColumnIndex(Datahelper.COLUMN_ID_USERS));
        cursor = database.query(Datahelper.TABLE_USERS, column_name_user, Datahelper.COLUMN_ID_USERS + " = " + id, null, null, null, null);
        String n = cursor.getString(cursor.getColumnIndex(Datahelper.COLUMN_NAME_USERS));
        return true;
    } catch (Exception e) {
    }
    return false;
}

public boolean correctPassword(String name, String psswd) {
    try {


        Cursor cursor = database.query(Datahelper.TABLE_USERS, column_id_user, Datahelper.COLUMN_NAME_USERS + " = " + name, null, null, null, null);
        long id = cursor.getLong(cursor.getColumnIndex(Datahelper.COLUMN_ID_USERS));
        cursor = database.query(Datahelper.TABLE_USERS, column_name_user, Datahelper.COLUMN_ID_USERS + " = " + id, null, null, null, null);
        String n = cursor.getString(cursor.getColumnIndex(Datahelper.COLUMN_NAME_USERS));
        cursor = database.query(Datahelper.TABLE_USERS, column_psswd_user, Datahelper.COLUMN_ID_USERS + " = " + id, null, null, null, null);
        String p = cursor.getString(cursor.getColumnIndex(Datahelper.COLUMN_PSSWD_USERS));
        if (n == name && psswd == p) return true;
    } catch (Exception e) {
    }
    return false;
}

}

希望你能帮助我,告诉你是否需要别的东西:)

日志:

12-20 20:33:56.684 24009-24009/com.ein_siedler.putzplaner D/Datasource: asking for reference
12-20 20:33:56.689 24009-24009/com.ein_siedler.putzplaner D/Datasource: received reference. path: /data/user/0/com.ein_siedler.putzplaner/databases/task_list.db
12-20 20:33:56.690 24009-24009/com.ein_siedler.putzplaner E/SQLiteLog: (1) no such column: Test
12-20 20:33:56.696 24009-24009/com.ein_siedler.putzplaner W/System.err: android.database.sqlite.SQLiteException: no such column: Test (code 1): , while compiling: SELECT _id FROM table_users WHERE name = Test
12-20 20:33:56.696 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
12-20 20:33:56.696 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
12-20 20:33:56.696 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
12-20 20:33:56.696 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
12-20 20:33:56.696 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
12-20 20:33:56.697 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1328)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1175)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1046)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1214)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at com.ein_siedler.putzplaner.Datasource.UserExists(Datasource.java:139)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at com.ein_siedler.putzplaner.activities.Anmeldung.anmelden(Anmeldung.java:50)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.view.View$DeclaredOnClickListener.onClick(View.java:4463)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.view.View.performClick(View.java:5233)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.view.View$PerformClick.run(View.java:21211)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
12-20 20:33:56.698 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
12-20 20:33:56.699 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.os.Looper.loop(Looper.java:148)
12-20 20:33:56.699 24009-24009/com.ein_siedler.putzplaner W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5539)
12-20 20:33:56.699 24009-24009/com.ein_siedler.putzplaner W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-20 20:33:56.699 24009-24009/com.ein_siedler.putzplaner W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
12-20 20:33:56.699 24009-24009/com.ein_siedler.putzplaner W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-20 20:33:56.743 24009-24009/com.ein_siedler.putzplaner D/AppTracker: App Event: stop
12-20 20:33:56.795 24009-24009/com.ein_siedler.putzplaner D/AppTracker: App Event: start
12-20 20:33:56.872 24009-24009/com.ein_siedler.putzplaner D/AbstractTracker: Event success
12-20 20:33:56.878 24009-24009/com.ein_siedler.putzplaner D/AbstractTracker: Event success
12-20 20:33:56.955 24009-24146/com.ein_siedler.putzplaner D/OpenGLRenderer: endAllStagingAnimators on 0xb35ec380 (RippleDrawable) with handle 0x9f07c660

DatahHelper类:

class Datahelper extends SQLiteOpenHelper {
//Strings für Datenbank
public static final String DB_NAME = "task_list.db";
public static final int DB_VERSION = 1;
public static final String TABLE_TASK_LIST = "task_list";
public static final String COLUMN_ID = "_id";
public static final String COLUMN_TYPE = "type";
public static final String COLUMN_NAME = "name";
public static final String COLUMN_EXPIRATION = "expiration";
public static final String COLUMN_OWNER = "owner";
public static final String SQL_CREATE = "CREATE TABLE " + TABLE_TASK_LIST + "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_TYPE + " TEXT NOT NULL, " + COLUMN_NAME + " TEXT NOT NULL, " + COLUMN_EXPIRATION + " TEXT NOT NULL, " + COLUMN_OWNER + " TEXT NOT NULL);";
public static final String TABLE_USERS = "table_users";
public static final String COLUMN_ID_USERS = "_id";
public static final String COLUMN_NAME_USERS = "name";
public static final String COLUMN_PSSWD_USERS = "psswd";
public static final String COLUMN_SOAP_USERS = "soap";
public static final String COLUMN_EP_USERS = "ep";
public static final String SQL_CREATE_USERS = "CREATE TABLE " + TABLE_USERS + "(" + COLUMN_ID_USERS + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME_USERS + " TEXT NOT NULL, " + COLUMN_PSSWD_USERS + " TEXT NOT NULL, " + COLUMN_SOAP_USERS + " INTEGER, " + COLUMN_EP_USERS + " INTEGER);";
private static final String LOG_TAG = Datahelper.class.getSimpleName();

public Datahelper(Context context) {
    //Konstruktor
    super(context, DB_NAME, null, DB_VERSION);
    Log.d(LOG_TAG, "Succesfully created database: " + getDatabaseName());


}

//Erstellen einer neuen Datenbank
@Override
public void onCreate(SQLiteDatabase db) {
    try {

        Log.d(LOG_TAG, "creating table " + SQL_CREATE);
        db.execSQL(SQL_CREATE);
        db.execSQL(SQL_CREATE_USERS);
    } catch (Exception ex) {
        Log.d(LOG_TAG, "Error while creating table: " + ex.getMessage());
    }

}

//Änderung an Struktur
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

}

更改代码后的错误日志,但我不知道如何格式化

    12-21 07:53:25.097 22705-22705/com.ein_siedler.putzplaner W/System.err:     android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0
12-21 07:53:25.098 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
12-21 07:53:25.098 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
12-21 07:53:25.098 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
12-21 07:53:25.099 22705-22705/com.ein_siedler.putzplaner W/System.err:     at com.ein_siedler.putzplaner.Datasource.UserExists(Datasource.java:141)
12-21 07:53:25.099 22705-22705/com.ein_siedler.putzplaner W/System.err:     at com.ein_siedler.putzplaner.activities.Anmeldung.anmelden(Anmeldung.java:47)
12-21 07:53:25.099 22705-22705/com.ein_siedler.putzplaner W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-21 07:53:25.099 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.view.View$DeclaredOnClickListener.onClick(View.java:4463)
12-21 07:53:25.099 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.view.View.performClick(View.java:5233)
12-21 07:53:25.099 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.view.View$PerformClick.run(View.java:21211)
12-21 07:53:25.100 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
12-21 07:53:25.100 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
12-21 07:53:25.100 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.os.Looper.loop(Looper.java:148)
12-21 07:53:25.100 22705-22705/com.ein_siedler.putzplaner W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5539)
12-21 07:53:25.100 22705-22705/com.ein_siedler.putzplaner W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
12-21 07:53:25.100 22705-22705/com.ein_siedler.putzplaner W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
12-21 07:53:25.100 22705-22705/com.ein_siedler.putzplaner W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
答案

我认为你的Datasource类中出现了问题,你的UserExists函数返回false;你不能看到任何错误,因为你在每个try-catch的catch异常部分错过了e.printStackTrace();尝试将e.printStackTrace();设置为datasource类中的每个try-catch并重建app并运行它。在那里展示Catlog ......

更新:

试试这个功能:

public boolean UserExists(String name) {
    try {
        Cursor cursor = database.query(Datahelper.TABLE_USERS, null, Datahelper.COLUMN_NAME_USERS + " = '" + name + "'", null, null, null, null);
        String n = cursor.getString(cursor.getColumnIndex(Datahelper.COLUMN_NAME_USERS));
        return true;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return false;
}

如果在sql查询中使用字符串值,则检查两次它必须在''之间

以上是关于Android SQLite用户登录不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 android studio 中使用 SQLite 显示上次登录的用户数据

Android:Facebook 登录不起作用

带有日期字符串的 Android SQLite rawquery 在 WHERE 子句中不起作用

Vue JS:检查用户登录是不是在我的代码中不起作用

SQLite - 跨数据库查询不起作用

Android Twitter登录按钮不起作用