Android-数据库Sqlite-DAO模式

DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口API,数据库操作对象设计模式,对数据库的CRUD的封装,简化代码中数据库的操作。


提示:这里可以添加本文要记录的大概内容:
Android 学习: http://www.wustwzx.com/web/#
参考教程


1.DbHelpr

SQLite数据库打开助手DbHelper作为抽象类SQLiteOpenHelper的子类,最主要需要重写2个抽象方法onCreate()和onUpgrade()

SQLiteOpenHelper是一个辅助类。作用:管理数据库(创建、增、修、删) & 版本的控制。
使用过程:通过创建子类继承SQLiteOpenHelper类,实现它的一些方法来对数据库DataBase进行操作。在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。

代码如下(示例):

public class SignalDbHelper extends SQLiteOpenHelper {

    public static final String DataBaseTable_name = "signalinfo";//数据库表名
    public static final int DataBase_version = 1;//数据库版本号
    public static final String longitude = "longitude", latgitude = "latgitude",distance="distance";//数据库主要内容,经度,纬度,当前点与信号源距离(Rssi计算得出)

    //构造方法:第1参数为上下文,第2参数库库名,第3参数为游标工厂,第4参数为版本
    public SignalDbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);//name数据库名.db
    }

    //创建数据库自动执行
    @Override
    public void onCreate(SQLiteDatabase db) {

        //不存在时建表,第一字段为自增长类型
        db.execSQL("create table if not exists "+ DataBaseTable_name +"(_id INTEGER PRIMARY KEY AUTOINCREMENT,longitude DOUBLE NOT NULL,latgitude DOUBLE NOT NULL,distance DOUBLE NOT NULL);");
    }

    //数据库版本升级自动执行
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists "+ DataBaseTable_name);//表存在删除
        onCreate(db);//重建数据库
    }

}

2.DAO

本类DAO调用了打开数据库的助手类DbHelper。本类DAO提供的CRUD接口针对数据库info.db的表signalinfo

代码如下(示例):

public class SignalfcDAO {
    private SQLiteDatabase sch_db;
    private SignalDbHelper sch_helper;//类的对象

    public static final String DataBase_name = "info";//数据库名.db

//    public static final String DataBaseTable_name = "signalinfo";//数据库表名
//    private static final String longitude = "longitude", latgitude = "latgitude",distance="distance";//数据库主要内容,经度,纬度,当前点与信号源距离(Rssi计算得出)


    //构造函数
    public SignalfcDAO(Context contsxt) {
        //初始变量
        //第1参数为上下文,第2参数为数据库名
        this.sch_helper = new SignalDbHelper(contsxt, DataBase_name+".db", null, 1);
    }

    /*
     *新增
     */
    //插入记录
    public void insertInfo(double lon, double lat,double dis) {
        // 通过DBHelper类获取一个读写的SQLiteDatabase对象
        sch_db = sch_helper.getWritableDatabase();
        // 创建ContentValue设置参数
        ContentValues contentValues = new ContentValues();
        contentValues.put(SignalDbHelper.longitude, lon);
        contentValues.put(SignalDbHelper.latgitude, lat);
        contentValues.put(SignalDbHelper.distance, dis);
        // 插入数据
        // insert方法参数1:要插入的表名
        // insert方法参数2:如果发现将要插入的行为空时,会将这个列名的值设为null
        // insert方法参数3:contentValue
        long i = sch_db.insert(SignalDbHelper.DataBaseTable_name, null, contentValues);//成功id,失败-1
        Log.v("数据库测试", "插入");

        // 释放连接
//        sch_db.close();//一般来说不要随便close(),我认为在在Activity执行onDestory的时候调用close()比较合理,或者整个App退出的时候再close()。
    }


    /*
     *查询
     * 返回全部
     */
    public Cursor allQueryInfo() {
        // 通过DBHelper类获取一个读写的SQLiteDatabase对象
        sch_db = sch_helper.getWritableDatabase();
        Cursor cursor=sch_db.rawQuery("select * from "+ SignalDbHelper.DataBaseTable_name, null);
        //sch_db.close();
        Log.d("数据库查询所有结果", String.valueOf(cursor.getCount()));

        return cursor;
    }

    /*
  查询数据表记录数
    */
    public  int getRecordsNumber(){  //返回数据表记录数
        sch_db = sch_helper.getReadableDatabase();
        Cursor cursor= sch_db.rawQuery("select * from "+SignalDbHelper.DataBaseTable_name,null);
        return cursor.getCount();
    }

    /*
    清空表
     */
    public void clearTable() {
        sch_db = sch_helper.getWritableDatabase();
        sch_db.execSQL("delete from " + SignalDbHelper.DataBaseTable_name);
        Log.d("清空数据表","....");

    }



    //通过id判断数据是否存在数据库中
    public boolean idexist(String id)
    {
        sch_db = sch_helper.getReadableDatabase();
        Cursor cursor = sch_db.rawQuery(
                "select * from   schedual  where   card_idnum=? ",
                new String[] { id });
        while (cursor.moveToNext()) {
            sch_db.close();
            Log.i(" search_city_name_exist", id + "在数据库已存在,return true");
            return true;// //在数据库已存在,返回true
        }
        sch_db.close();
        Log.d(" id_exist", id + "在数据库不存在,return false");
        return false;
    }
}

3.MainActivity中使用

本类对数据库的插入操作和查询,使用了DAO类的相关方法

代码如下(示例):


public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    private SignalfcDAO DAO;  //数据库访问对象

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

        DAO = new SignalfcDAO(this);  //创建数据库访问对象
        if(DAO.getRecordsNumber()==0) {  //防止重复运行时重复插入记录
            DAO.insertInfo(20, 2020);   //插入记录
        }
    }

	其余代码省略......

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值