繁体   English   中英

Android Studio:SQLite 数据库不创建

[英]Android Studio: SQLite database doesn't create

我目前正在为自己构建一个密码管理器应用程序。 我计划将密码保存在 SQLite 数据库中。 为此,我使用此代码:

package com.example.passwordmanager;

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

import androidx.annotation.Nullable;

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String COLUMN_PASSWORD = "password";
    public static final String PASSWORDS_TABLE = COLUMN_PASSWORD + "s_table";
    public static final String COLUMN_ID = "id";
    public static final String COLUMN_SERVICE = "service";
    public static final String COLUMN_CREATION_DATE = "creation_date";
    public static final String COLUMN_USED_NAME = "used_name";
    public static final String COLUMN_USED_EMAIL = "used_email";


    public DatabaseHelper(@Nullable Context context) {
        super(context,  "passwordManager.db", null,1);
        Log.d("DatabaseHelper","Constructor reached");

    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTableStatement = "CREATE TABLE "+ PASSWORDS_TABLE + " ( " + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_SERVICE + " VARCHAR(40), " + COLUMN_PASSWORD + " VARCHAR(40), " + COLUMN_CREATION_DATE + " VARCHAR(11), " + COLUMN_USED_NAME + " VARCHAR(40), " + COLUMN_USED_EMAIL + " VARCHAR(40), master VARCHAR(20), firstTime BOOLEAN)";
        Log.d("DatabaseHelper","OnCreate1 reached");
        db.execSQL(createTableStatement);
        Log.d("DatabaseHelper","OnCreate2 reached");
    }

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

        db.execSQL("DROP TABLE IF EXISTS "+PASSWORDS_TABLE);
        onCreate(db);

    }


    public boolean addToTable(Registration profile){

        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues cv = new ContentValues();

        cv.put(COLUMN_PASSWORD,profile.hashedPassword);
        cv.put(COLUMN_SERVICE,profile.service);
        cv.put(COLUMN_CREATION_DATE,profile.creation_date);
        cv.put(COLUMN_USED_NAME,profile.used_name);
        cv.put(COLUMN_USED_EMAIL,profile.used_email);

        long insert = db.insert(PASSWORDS_TABLE, null, cv);

        if(insert==-1){
            return true;
        }else{
            return false;
        }


    }
}

这段代码的问题是,它只是没有在 data\\data\\com.example.passwordmanager 中创建数据库或数据库文件夹。 我尝试输出调用构造函数时它将到达的方法,但我意识到它永远不会到达 onCreate 方法。

DatabaseHelper 类只被调用一次,以便:

package com.example.passwordmanager;

import androidx.appcompat.app.AppCompatActivity;

import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.hardware.input.InputManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.Toast;

public class CreatingNewEntryActivity extends AppCompatActivity {
   

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


        DatabaseHelper dh = new DatabaseHelper(CreatingNewEntryActivity.this);
}

这是代码的问题吗? 我是否必须在 manifest.xml 中授予权限? 我在模拟器上搞砸了吗? 该应用程序启动正常,只是不创建数据库。

您需要在数据库助手上调用getWritableDatabase()getReadableDatabase()以使框架创建数据库文件并触发onCreate() 仅仅调用构造函数是不够的。

另请参阅: SQLiteOpenHelper onCreate() / onUpgrade() 何时运行?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM