当前位置: 首页 > 知识库问答 >
问题:

Android的Sqlite数据库问题

傅朗
2023-03-14

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

有什么想法吗?

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


}




}

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


}
}

contact.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;
}



}

共有1个答案

闻人修明
2023-03-14

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

改变

cursor.getString(2);

cursor.getString(cursor.getColumnIndex(COLUMN_UNAME));
String query = "select * from " + TABLE_NAME + " WHERE uname = " + uname;
 类似资料:
  • 本文向大家介绍Android中的SQLite数据库简介,包括了Android中的SQLite数据库简介的使用技巧和注意事项,需要的朋友参考一下 SQLite简介: SQLite是Android系统采用的一种开源的轻量级的关系型的数据库,Android中允许每个应用程序都拥有自己独立的数据库,每个应用程序的数据库的位置一般在/data/data/<package_name>/databases中。为

  • 然而,敬虔加上知足的心便是大利了,因为我们没有带什么到世上来,也不能带什么去,只要有衣有食,就当知足。但那些想要发财的人,就陷在迷惑、落在网罗和许多无知有害的私欲里,叫人沉在败坏和灭亡中。贪财是万恶之根。有人贪恋钱财,就被引诱离了真道,用许多愁苦把自己刺透了。(1 TIMOTHY 6:6-10) SQLite数据库 SQLite是一个小型的关系型数据库,它最大的特点在于不需要服务器、零配置。前面的

  • 我试图做的是查询并在游标中返回vehicle\u implement表中的所有列及其左侧的所有表,通过图中所示的外键连接。在vehicle\u implement中有一些null implement\u id,我仍然需要这些行。没有,也不会有任何空的vehicle\u id。我认为,当implement\u id为null时,可能无法从implement表左侧的表中返回任何内容,这会阻止我获取所需

  • 本文向大家介绍Android SQLite数据库中的表详解,包括了Android SQLite数据库中的表详解的使用技巧和注意事项,需要的朋友参考一下 Android SQLite数据库 前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的函数,对于数据库的查看很不方便,于是就写了一下查

  • 问题内容: 我正在寻找一种使用Swift代码在我的应用程序中访问SQLite数据库的方法。 我知道我可以在Objective C中使用SQLite包装器并使用桥接头,但是我希望能够完全在Swift中完成此项目。如果可以的话,有没有办法做到这一点,有人可以将我指向一个引用,该引用显示了如何提交查询,检索行等。 问题答案: 虽然您可能应该使用许多SQLite包装器之一,但如果您想知道如何自己调用SQL

  • 5.7.1.SQLite以及Android的数据库支持 Android自带了 SQLite 数据库的支持。SQLite短小精悍,更有Android框架中丰富的API,使用起来会很容易。本节我们介绍SQLite及其配套API的使用方法。哦,在这里还没必要精通SQL,不过了解一些SQL总是好的。