java - 数据库文件不创建 Android

标签 java android sqlite

我正在 Android 平台上实现一个软件,我正在为其使用 SQLLite 数据库。我已经将所有关于连接到数据库的代码放在 DBUserAdapter 类中,而其他 loginScreen 和 registerScreen 类分别具有用于登录和注册方法的代码。

当我单击注册按钮时,日志显示数据库文件不可用。谁能帮我解决这个问题。在此先感谢.. :)

这是我的 DBUserAdapter.java 类


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

import java.sql.SQLException;

/**
* Created by Miuranga Salgado on 9/29/2015.
*/
public class DBUserAdapter {
public static final String KEY_ROWID = "_id";
public static final String KEY_USERNAME = "username";
public static final String KEY_PASSWORD = "password";
public static final String KEY_PASSHINT = "passHint";
public static final String TAG = "DBAdapter";

public static final String DATABASE_NAME = "usersdb";
public static final String DATABASE_TABLE = "userInfo";
public static final int DATABASE_VERSION = 1;

public static final String DATABASE_CREATE = "CREATE TABLE "+DATABASE_TABLE+"(_id INTEGER PRIMARY KEY AUTOINCREMENT, username varchar(100)TEXT NOT NULL, password varchar(100)TEXT NOT NULL, passHint varchar(100)TEXT NOT NULL);";

private Context context = null;
private DatabaseHelper dbHelper;
public SQLiteDatabase db;

public DBUserAdapter(Context context){
    this.context = context;
    dbHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper{
    DatabaseHelper(Context context){
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DATABASE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w(TAG, "Upgrading Database from Version "+oldVersion+" to "+newVersion+", Which will Destroy all old Data");
        db.execSQL("DROP TABLE IF EXISTS userInfo");
        onCreate(db);
    }
}

public void open() throws SQLException{
    db = dbHelper.getWritableDatabase();
}

public void close(){
    db.close();
}

public SQLiteDatabase getDatabaseInstance(){
    return db;
}

public boolean AddUser(String username, String password, String passHint){
    try {
        ContentValues initialValues = new ContentValues();
        initialValues.put(KEY_USERNAME, username);
        initialValues.put(KEY_PASSWORD, password);
        initialValues.put(KEY_PASSHINT, passHint);
        db.insert(DATABASE_TABLE, null, initialValues);
        db.close();
        return true;
    }
    catch (Exception e){
        e.printStackTrace();
    }
    return false;
}

public boolean Login(String username, String password) throws SQLException{
    Cursor cursor = db.rawQuery("SELECT * FROM " + DATABASE_TABLE + " WHERE username=? AND password=?", new String[]{username, password});
    if(cursor != null){
        if (cursor.getCount() > 0){
            return true;
        }
    }
    return false;
}

public String getPassword(String userName){
    Cursor cursor = db.query(DATABASE_TABLE, null, "username=?", new String[]{userName}, null, null, null);
    if (cursor.getCount()<1){
        cursor.close();
        return "NOT EXIST";
    }
    cursor.moveToFirst();
    String password = cursor.getString(cursor.getColumnIndex("PASSWORD"));
    cursor.close();
    return password;
}

public boolean register(String username, String password, String passHint)throws SQLException{
    Cursor cursor = db.rawQuery("INSERT INTO "+DATABASE_TABLE+" VALUES('?', '?', '?', '?');", new String[]{username, password, passHint});
    if(cursor != null){
        if(cursor.getCount() > 0){
            return true;
        }
    }
    return false;
}
}

这是我的 loginScreen.java 类

public class loginScreen extends Activity {

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

    final EditText loginUser = (EditText) findViewById(R.id.inputUser);
    final EditText loginPass = (EditText) findViewById(R.id.inputPass);

    Button btnLogin = (Button) findViewById(R.id.loginBtn);
    Button btnRegister = (Button) findViewById(R.id.registerBtn);
    btnLogin.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String username = loginUser.getText().toString();
            String password = loginPass.getText().toString();
            //String relPassword = userAdapter.getPassword(username);
            try {
                if (username.length() > 0 && password.length() > 0) {
                    DBUserAdapter dbAdapter = new DBUserAdapter(loginScreen.this);
                    dbAdapter.open();
                    if (dbAdapter.Login(username, password)) {
                        Toast.makeText(loginScreen.this, "Successfully Logged In", Toast.LENGTH_LONG).show();

                    } else {
                        Toast.makeText(loginScreen.this, "Invalid Username or Password", Toast.LENGTH_LONG).show();
                    }
                    dbAdapter.close();
                }
            } catch (Exception e) {
                Toast.makeText(loginScreen.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
            //if(password.equals(relPassword)) {
            //    Toast.makeText(loginScreen.this, "Successfully Logged In", Toast.LENGTH_LONG).show();
            //}
            //else {
            //    Toast.makeText(loginScreen.this, "Sorry, Invalid Username or Password", Toast.LENGTH_LONG).show();
            //}
        }
    });

    btnRegister.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(loginScreen.this, registerScreen.class);
            startActivity(intent);
        }
    });
}
}

这是registerScreen.java类


public class registerScreen extends Activity{

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

    final EditText regUsername = (EditText)findViewById(R.id.regUserName);
    final EditText regPassword = (EditText)findViewById(R.id.regPassword);
    final EditText regPassHint = (EditText)findViewById(R.id.regPassHint);

    Button regButton = (Button)findViewById(R.id.btnCreateAcc);
    regButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String username = regUsername.getText().toString();
            String password = regPassword.getText().toString();
            String passHint = regPassHint.getText().toString();
            try {
                if (username.length() > 0 && password.length() > 0 && passHint.length() > 0){
                    DBUserAdapter dbAdapter = new DBUserAdapter(registerScreen.this);
                    dbAdapter.open();
                    if(dbAdapter.AddUser(username, password, passHint)){
                        Toast.makeText(registerScreen.this, "You're Registered Successfully", Toast.LENGTH_LONG).show();
                    }
                    else {
                        Toast.makeText(registerScreen.this, "User Not Registered", Toast.LENGTH_LONG).show();
                    }
                    dbAdapter.close();
                }
            }
            catch (Exception e){
                Toast.makeText(registerScreen.this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
            }

    });
}
}

这是错误日志


      09-30 00:28:57.821       482-482/supprioritizer.warnerit.com.supermarketprioritizer E/SQLiteLog﹕ (1) no such table: userInfo
09-30 00:28:57.829      482-482/supprioritizer.warnerit.com.supermarketprioritizer E/SQLiteDatabase﹕ Error inserting passHint=123 password=123 username=Randula
    android.database.sqlite.SQLiteException: no such table: userInfo (code 1): , while compiling: INSERT INTO userInfo(passHint,password,username) VALUES (?,?,?)
            at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
            at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:891)
            at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:502)
            at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
            at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
            at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
            at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
            at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
            at supprioritizer.warnerit.com.supermarketprioritizer.DBUserAdapter.AddUser(DBUserAdapter.java:73)
            at supprioritizer.warnerit.com.supermarketprioritizer.registerScreen$1.onClick(registerScreen.java:37)
            at android.view.View.performClick(View.java:4797)
            at android.view.View$PerformClick.run(View.java:19899)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5309)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

最佳答案

1. 更改您的创建表字符串,它无效,试试这个:

"CREATE TABLE "+DATABASE_TABLE+"(_id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL, passHint TEXT NOT NULL);"

2。 升级数据库,尝试在构造函数中执行此操作:

public static final int DATABASE_VERSION = 2;
DatabaseHelper(Context context){
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

关于java - 数据库文件不创建 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32852139/

相关文章:

java - TreeView/TreeTableView - KeyEvent F2 导致 JavaFX 内部 NPE

android - 将 dp 值转换为 WebView 内部可用的 px 值(dp 到 CSS px)

c++ - 将OpenCV::Mat作为BLOB存储到SQLite DB

python-3.x - 如何在两列中加载信息?

python - SQLite 查询返回 false

java - 使用枚举组合框中的值作为 setter 的参数

java - 在 Java 中为变量分配动态名称

java - 根据文档列表查询 FireStore

android - Adobe AIR 是否正在将 Flash 文件导出到手机?

android - 如何让 ActionBar 和 stacked bar 共享相同的背景图片