【问题标题】:Sqlite database issue with AndroidAndroid 的 Sqlite 数据库问题
【发布时间】:2017-10-10 05:59:55
【问题描述】:

构建一个基本的基于 sqlite 的登录/注册应用程序。登录后应用崩溃。

有什么想法吗?

DatabaseHelper.java:

   package com.example.android.sqliteapp;

   import android.content.ContentValues;
   import android.content.Context;
   import android.database.Cursor;
   import android.database.sqlite.SQLiteDatabase;
   import android.database.sqlite.SQLiteOpenHelper;

 public class DatabaseHelper extends SQLiteOpenHelper {

// Database Version
private static final int DATABASE_VERSION = 1;

// Database Name
private static final String DATABASE_NAME = "contacts.db";

// User table name
private static final String TABLE_NAME = "contacts";

// User Table Columns names
private static final String COLUMN_ID = "id";
private static final String COLUMN_NAME = "name";
private static final String COLUMN_EMAIL = "email";
private static final String COLUMN_UNAME = "uname";
private static final String COLUMN_PASS = "pass";
SQLiteDatabase db;

// create table sql query
private static final String TABLE_CREATE = "create table contacts (id integer primary key not null , " +
        "name text not null, email text not null, uname text not null, pass text not null)";

// constructor
public DatabaseHelper(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(TABLE_CREATE);
    this.db = db;
}

// inserting data from SignUp to DB
public void insertContact(Contact c){
    db = this.getWritableDatabase();
    ContentValues values = new ContentValues();

    String query = "select * from " + TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    int count = cursor.getCount();

    values.put(COLUMN_ID, count);    // each contact will have unique IDs counting from 0 upwards
    values.put(COLUMN_NAME, c.getName());
    values.put(COLUMN_EMAIL, c.getEmail());
    values.put(COLUMN_UNAME, c.getUname());
    values.put(COLUMN_PASS, c.getPass());

    db.insert(TABLE_NAME, null, values); // this will officially insert the contact object into the DB
    db.close(); // close it
}

// this is where the search password method is created
public String searchPass(String uname) {
    db = this.getReadableDatabase();
    String query = "select * from " + TABLE_NAME;
    Cursor cursor = db.rawQuery(query, null);
    String a, b;
    b = "not found";
    if (cursor.moveToFirst()) {

        do {
            a = cursor.getString(cursor.getColumnIndex(COLUMN_UNAME));

            if (a.equals(uname)) {
                b = cursor.getString(cursor.getColumnIndex(COLUMN_PASS));
                break;
            }
        }
        while(cursor.moveToNext());
    }
    return b; // b is the returned password
}


@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    //Drop User Table if exist
    String query = "DROP TABLE IF EXISTS " + TABLE_NAME;
    db.execSQL(query);
    // Create tables again
    this.onCreate(db);
}
}

应用现在在点击登录后崩溃

错误日志:

05-11 06:27:30.850 3471-3471/com.example.android.sqliteapp E/AndroidRuntime: 致命异常: main 进程:com.example.android.sqliteapp,PID:3471 java.lang.IllegalStateException:无法执行 android:onClick 的方法 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:293) 在 android.view.View.performClick(View.java:5637) 在 android.view.View$PerformClick.run(View.java:22429) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 引起:java.lang.reflect.InvocationTargetException 在 java.lang.reflect.Method.invoke(本机方法) 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 在 android.view.View.performClick(View.java:5637) 在 android.view.View$PerformClick.run(View.java:22429) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 引起:android.content.ActivityNotFoundException:无法找到显式活动类{com.example.android.sqliteapp/com.example.android.sqliteapp.Display};您是否在 AndroidManifest.xml 中声明了此活动? 在 android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:1805) 在 android.app.Instrumentation.execStartActivity(Instrumentation.java:1523) 在 android.app.Activity.startActivityForResult(Activity.java:4225) 在 android.support.v4.app.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:50) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:79) 在 android.app.Activity.startActivityForResult(Activity.java:4183) 在 android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859) 在 android.app.Activity.startActivity(Activity.java:4522) 在 android.app.Activity.startActivity(Activity.java:4490) 在 com.example.android.sqliteapp.MainActivity.onButtonClick(MainActivity.java:36) 在 java.lang.reflect.Method.invoke(本机方法) 在 android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:288) 在 android.view.View.performClick(View.java:5637) 在 android.view.View$PerformClick.run(View.java:22429) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

MainActivity Java:

package com.example.android.sqliteapp;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

DatabaseHelper helper = new DatabaseHelper(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

public void onButtonClick(View v) {

    // if user clicks on LOGIN
    if (v.getId() == R.id.bLogin) {

        // Grab all Username and Password input
        EditText a = (EditText) findViewById(R.id.etUsername);
        String str = a.getText().toString();
        EditText b = (EditText) findViewById(R.id.etPassword);
        String pass = b.getText().toString();

        String password = helper.searchPass(str);
        if (pass.equals(password)) {

            Intent i = new Intent(MainActivity.this, Display.class);
            i.putExtra("Username", str);
            startActivity(i);
        }
        else {
            Toast temp = Toast.makeText(MainActivity.this, "Username and Password don't match!", Toast.LENGTH_SHORT);
            temp.show();

        }


    }

    if (v.getId() == R.id.bSignup) {

        Intent i = new Intent(MainActivity.this, SignUp.class);
        startActivity(i);
    }


}




}

显示.java:

package com.example.android.sqliteapp;

import android.os.Bundle;
import android.os.PersistableBundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

public class Display extends AppCompatActivity{

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.display);

    String username = getIntent().getStringExtra("Username");
    TextView tv = (TextView) findViewById(R.id.tvUsername);
    tv.setText(username);


}
}

联系.java:

package com.example.android.sqliteapp;


public class Contact {

private int id;
private String name;
private String email;
private String uname;
private String pass;

public int getId() {
    return this.id;
}

public void setId(int id) {
    this.id = id;
}

public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return this.email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getUname() {
    return this.uname;
}

public void setUname(String uname) {
    this.uname = uname;
}

public String getPass() {
    return this.pass;
}

public void setPass(String pass) {
    this.pass = pass;
}



}

【问题讨论】:

  • 据我所知,索引 2 不是uname。如果您使用SELECT *,您还会得到id,这意味着uname 将在第3 列中
  • 错误与其他内容有关,您从哪里调用 onButtonClick() ?
  • 如果您有新问题,最好发布一个新问题。由于问题发生了变化,否则您会使所有答案都不正确。请参阅下面我对您的新问题的回答。

标签: android sqlite


【解决方案1】:

你应该真正传入列名并获取它的索引,而不是直接索引。

改变

cursor.getString(2);

cursor.getString(cursor.getColumnIndex(COLUMN_UNAME));

等等。如果以任何方式更改表或查询,这将使其更加通用。

附带说明,您应该更改您的查询,以便它只返回一个匹配的记录,该用户名。而不是所有记录,然后循环查找匹配的记录。

例如

String query = "select * from " + TABLE_NAME + " WHERE uname = " + uname;

编辑:对于您收到的第二个错误ActivityNotFoundException。在日志中,它清楚地说明了have you declared this activity in your AndroidManifest.xml解决方案是将您尝试启动的活动添加到清单中。 More info on how to do this here

【讨论】:

  • 我真傻!它现在完美运行,感谢 Doomsknight!
【解决方案2】:

如下改变你的 searchPass() 方法:

public String searchPass(String uname) {
db = this.getReadableDatabase();
String query = "select * from " + TABLE_NAME;
Cursor cursor = db.rawQuery(query, null);
String a, b;
b = "not found";
if (cursor.moveToFirst()) {

    do {
        a = cursor.getString(cursor.getColumnIndex(COLUMN_UNAME));
        if (a.equals(uname)) {

            b = cursor.getString(cursor.getColumnIndex(COLUMN_PASS));
            break;
        }
    }
    while(cursor.moveToNext());
 }
 return b; // b is the returned password
}

因为你的 uname 的索引是 3 而通过的索引是 4

【讨论】:

  • 我按照你说的做了,现在点击登录按钮后应用程序崩溃了。这会恢复到其他活动问题吗?
  • 当然。请查看我编辑的带有错误日志的帖子。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-06
  • 2022-11-24
  • 1970-01-01
  • 2010-10-28
  • 2014-07-11
相关资源
最近更新 更多