lkf181 2023-07-17 05:27 采纳率: 86.5%
浏览 10

Android SQLiteDatabase 如何灌注初始数据?

创建了一个继承SQLiteOpenHelper的类,在其中的:onCreate方法中创建数据表结构,同时我想再插入一条默认的数据(要求是:像onCreate一样,只要数据表已经存在,就不要再次重复插入默认数据)研究了半天,有个onOpen方法,但好像每次打开数据库它都会执行,肿么办呢?
下面把代码贴出来吧

package Dal;

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

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import java.time.LocalDateTime;

import Model.M;
import Model.Mt_Message;
import Model.Mt_settings;

public class DbHelper extends SQLiteOpenHelper {
    private static final String DBNAME = "lkfscreendb.db";//数据库名字
    private static final String T_settings = "T_settings";//表名
    private static final String T_Message = "T_Message";//表名
    private static final int VERSION = 1;//数据库版本号,一般以 1 开始
    private SQLiteDatabase mReadLink;//读链接 因为读写时 数据库的锁 不一样
    private SQLiteDatabase mWriteLink;// 写链接

    private static DbHelper mInstance;
    /**
     * 单利模式得到数据库操作类的唯一实例
     * 建议在应用页面的 onStart()调用
     * @param p_context
     * @return
     */
    public static DbHelper getInstance(Context p_context){
        if (mInstance == null){
            mInstance = new DbHelper(p_context);
        }
        return mInstance;
    }
    public DbHelper(@Nullable Context context) {
        super(context, DBNAME, null, VERSION);
    }
    /**
     * 打开可读数据库链接 (只有查询用可读链接)
     *  建议在Activity应用页面的 onStart()统一调用
     *  在其他类中 例如MyApplication中 打开链接与关闭链接成对出现!
     * @return
     */
    public SQLiteDatabase openReadLink(){
        if (this.mReadLink == null || !this.mReadLink.isOpen()){
            this.mReadLink = mInstance.getReadableDatabase();
        }
        return this.mReadLink;
    }

    /**
     * 打开可写数据库链接 (增删改 都用可写链接)
     * 建议在应Activity用页面的 onStart()统一调用
     * 在其他类中 例如MyApplication中 打开链接与关闭链接成对出现!
     * @return
     */
    public SQLiteDatabase openWriteLink(){
        if (this.mWriteLink == null || !this.mWriteLink.isOpen()){
            this.mWriteLink = mInstance.getWritableDatabase();
        }
        return this.mWriteLink;
    }
    /**
     * 关闭数据库链接 (可读可写链接都关闭)
     * 建议在Activity应用页面的  onStop()方法调用
     * 如果该页面是主页面 放在 onDestroy()方法中调用
     *
     * 在其他类中 例如MyApplication中 打开链接与关闭链接成对出现!
     */
    public void closeLink(){
        if (this.mReadLink != null && this.mReadLink.isOpen()) {
            this.mReadLink.close();
            this.mReadLink = null;
        }
        if (this.mWriteLink != null && this.mWriteLink.isOpen()) {
            this.mWriteLink.close();
            this.mWriteLink = null;
        }
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        StringBuffer lSbSql1 = new StringBuffer();
        lSbSql1.append("CREATE TABLE IF NOT EXISTS "+T_settings+" (");
        lSbSql1.append("Id INTEGER PRIMARY KEY AUTOINCREMENT, TextOrientation TEXT (50)  NOT NULL, Speed REAL NOT NULL,TextSize INTEGER NOT NULL,");
        lSbSql1.append("Font TEXT (50)  NOT NULL, TextColor TEXT (10) NOT NULL,Background TEXT (50) NOT NULL,ColorMatching TEXT (100) NOT NULL,");
        lSbSql1.append(" IsCurrent INTEGER NOT NULL);");
        db.execSQL(lSbSql1.toString());
        StringBuffer lSbSql2 = new StringBuffer();
        lSbSql2.append("CREATE TABLE IF NOT EXISTS "+T_Message+" (");
        lSbSql2.append(" Id INTEGER PRIMARY KEY AUTOINCREMENT, DataMessage TEXT (1000), IsCurrent INTEGER NOT NULL);");
        db.execSQL(lSbSql2.toString());
        try{
            addInitDefaultValues();
        }catch(Exception e){
            Log.i("LKFTAG", "Exception: "+e.getMessage());
        }
//        Exception: getDatabase called recursively

    }

    @Override
    public void onOpen(SQLiteDatabase db) {
        super.onOpen(db);
         Log.d("LKFTAG", "DbHelper_onOpen:"+ java.time.LocalTime.now());
    }

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



    /**
     * 向两个表里出入初始化数据 (一次性插入多条数据 这里使用了事务机制)
     * @return  true为成功
     */
    public boolean addInitDefaultValues(){
        boolean lIsSuccess = false;
        try {
            this.openWriteLink().beginTransaction();

            ContentValues lCvT_settings = new ContentValues();
            lCvT_settings.put(M.TextOrientation,"rbtn_horizontal");
            lCvT_settings.put(M.Speed,0);
            lCvT_settings.put(M.TextSize,72);
            lCvT_settings.put(M.Font,"simfang.ttf");
            lCvT_settings.put(M.TextColor,"#ffffff");
            lCvT_settings.put(M.Background,"#000000");
            lCvT_settings.put(M.ColorMatching,"#ffffff|#000000");
            lCvT_settings.put(M.IsCurrent,1);
            this.mWriteLink.insert(T_settings,null,lCvT_settings);

            ContentValues lCvT_Message = new ContentValues();
            lCvT_Message.put(M.DataMessage,"");
            lCvT_Message.put(M.IsCurrent,1);
            this.openWriteLink().insert(T_Message,null,lCvT_Message);


            this.mWriteLink.setTransactionSuccessful();
            lIsSuccess = true;
        }catch (Exception ex){ex.printStackTrace();}
        finally {
            this.openWriteLink().endTransaction();
        }
        return lIsSuccess;
    }

    @SuppressLint("Range")
    public Mt_settings queryTsettingByIsCurrent(){
        Mt_settings lTmodel = new Mt_settings();
        Cursor lCursor = this.mReadLink.query(T_settings,
                new String[]{"Id","TextOrientation","Speed","TextSize","Font","TextColor","Background","ColorMatching"},
                "IsCurrent = @IsCurrent",new String[]{"1"},
                null,null,null);
        while (lCursor.moveToNext()){
            lTmodel.setId(lCursor.getInt(lCursor.getColumnIndex("Id")));
            lTmodel.setTextOrientation(lCursor.getString(lCursor.getColumnIndex("TextOrientation")));
            lTmodel.setSpeed(lCursor.getFloat(lCursor.getColumnIndex("Speed")));
            lTmodel.setTextSize(lCursor.getInt(lCursor.getColumnIndex(M.TextSize)));
            lTmodel.setFont(lCursor.getString(lCursor.getColumnIndex(M.Font)));
            lTmodel.setTextColor(lCursor.getString(lCursor.getColumnIndex(M.TextColor)));
            lTmodel.setBackground(lCursor.getString(lCursor.getColumnIndex(M.Background)));
            lTmodel.setColorMatching(lCursor.getString(lCursor.getColumnIndex(M.ColorMatching)));
        }
        return lTmodel;
    }
    @SuppressLint("Range")
    public Mt_Message queryTmessageByIsCurrent(){
        Mt_Message lTmodel = new Mt_Message();
        Cursor lCursor = this.mReadLink.query(T_Message,
                new String[]{"Id","DataMessage"},
                "IsCurrent = @IsCurrent",new String[]{"1"},
                null,null,null);
        while (lCursor.moveToNext()){
            lTmodel.setId(lCursor.getInt(lCursor.getColumnIndex("Id")));
            lTmodel.setDataMessage(lCursor.getString(lCursor.getColumnIndex(M.DataMessage)));
        }
        return lTmodel;
    }

    public void UpdateDataMessage(String pValue) {
        ContentValues lContenValues = new ContentValues();
        lContenValues.put(M.DataMessage,pValue);
        this.mWriteLink.update(T_Message,lContenValues,
                "IsCurrent = @IsCurrent",new String[]{"1"});
    }
    //  l_ContentValues.put("Address",pUser.getAddress()); 不需要更新的值不要给值,否则将更新为null
    public long updateTextOrientation(String pTextOrientation){
        ContentValues l_ContentValues = new ContentValues();
        l_ContentValues.put(M.TextOrientation,pTextOrientation);
        return this.mWriteLink.update(T_settings,l_ContentValues,
                "IsCurrent = @IsCurrent",new String[]{"1"});
    }
    public void UpdateBackground(String pResouceID) {
        ContentValues lContenValues = new ContentValues();
        lContenValues.put(M.Background,pResouceID);
        this.mWriteLink.update(T_settings,lContenValues,
                "IsCurrent = @IsCurrent",new String[]{"1"});
    }

    public void UpdateTextColor(String pTag) {
        ContentValues lContenValues = new ContentValues();
        lContenValues.put(M.TextColor,pTag);
        this.mWriteLink.update(T_settings,lContenValues,
                "IsCurrent = @IsCurrent",new String[]{"1"});
    }



    public void UpdateTextSize(String pTextSize) {
        ContentValues lContenValues = new ContentValues();
        lContenValues.put(M.TextSize,pTextSize);
        this.mWriteLink.update(T_settings,lContenValues,
                "IsCurrent = @IsCurrent",new String[]{"1"});
    }

    public void UpdateSpeed(String pSpeed) {
        ContentValues lContenValues = new ContentValues();
        lContenValues.put(M.Speed,pSpeed);
        this.mWriteLink.update(T_settings,lContenValues,
                "IsCurrent = @IsCurrent",new String[]{"1"});
    }

    public void UpdateFont(String pFont) {
        ContentValues lContenValues = new ContentValues();
        lContenValues.put(M.Font,pFont);
        this.mWriteLink.update(T_settings,lContenValues,
                "IsCurrent = @IsCurrent",new String[]{"1"});
    }
}


  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-17 08:04
    关注
    • 你看下这篇博客吧, 应该有用👉 :使用SQLite数据库进行创建表时没有走onCreate()方法
    • 除此之外, 这篇博客: 安卓之数据库(SQLite)中的 1.编写类继承SQLiteOpenHelper,覆写onCreate方法和onUpgrade方法 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • package com.example.yogi.courseapp;
      
      import android.content.Context;
      import android.database.sqlite.SQLiteDatabase;
      import android.database.sqlite.SQLiteOpenHelper;
      
      public class CourseData extends SQLiteOpenHelper {
          private static final String db_name = "CourseDatas";//自定义的数据库名;
          private static final int version = 2;//版本号,增加则会执行onUpgrade方法?
      
          public CourseData(Context context) {
              super(context, db_name, null, version);
      
          }
      
          // 该方法会自动调用,首先系统会检查该程序中是否存在数据库名为‘CoursDatas’的数据库
          // 如果存在则不会执行该方法,如果不存在则会执行该方法。
          @Override
          public void onCreate(SQLiteDatabase db) {
              String  sql ="create table courses(" +
                      "id Integer primary key autoincrement," +     //id自增,只支持integer不支持int
                      "coursename varchar(30)," +
                      "teacher varchar(20)," +
                      "time varchar(50)," +
                      "classroom varchar(30)" +
                      ")";
              db.execSQL(sql);
          }
      
          //数据库版本更新时执行该方法,如果表已存在则先删除再调用onCreate重新创建
          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
              db.execSQL("drop table if exists courses");
              onCreate(db);
          }
      }
      
      
    评论

报告相同问题?

问题事件

  • 创建了问题 7月17日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度