创建了一个继承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"});
}
}