zoukankan      html  css  js  c++  java
  • android 学习随笔四(数据库存储)

    SQLite数据库(sqliteexpert工具),sqlite数据库是轻量级数据库,对数据类型要求不是很严格,在数据库中处理是按verchar类型处理,一般定义表字段时还是要求严格按照数据类型定义,方便代码阅读。

    • 创建数据库

    基于android.database.sqlite.SQLiteOpenHelper创建MyOpenHelper,调用SQLiteDatabase db = oh.getWritableDatabase()方法创建数据库,数据库创建后再调用此方法不会再创建数据库,数据库创建只会执行一次,除非升级数据库(系统根据版本号判断)

    -----------------------------------------------------------

    public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context, String name, CursorFactory factory,
    int version) {
    //arg0:上下文
    //arg1:数据库文件名
    //arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
    //arg3:版本号不能小于1,用于升级
    super(context, name, factory, version);
    }

    //创建数据库时调用
    @Override
    public void onCreate(SQLiteDatabase db) {
    System.out.println("数据库创建");
    }

    //升级数据库调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    System.out.println("数据库升级");
    }

    }

    ------------------------------------------------------------------------------------------------

    为防止在调用时写错数据库名、版本号,可以写死数据库名、版本号

    public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context) {//本来是四个参数,只用一个参数,其他参数不用传递
    //arg0:上下文
    //arg1:数据库文件名
    //arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
    //arg3:版本号不能小于1,用于升级
    super(context, "people.db", null, 1);
    }

    -------------------------------------------------------------------------------------------------

    public class Test extends AndroidTestCase {

    public void test(){
    //获取虚拟上下文
    MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
    //如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
    SQLiteDatabase db = oh.getWritableDatabase();
    }
    }

    -------------------------------------------------------------------------------------------------------

    • 创建表(在创建数据库时创建表)

    //创建数据库时调用
    @Override
    public void onCreate(SQLiteDatabase db) {
    String sql = "create table person(_id integer primary key autoincrement,name char(10),phone char(20),salary integer(10))";
    //创建表
    db.execSQL(sql);
    }

    • 插入数据

    public class Test extends AndroidTestCase {

    public void test(){
    //获取虚拟上下文
    MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
    //如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
    SQLiteDatabase db = oh.getWritableDatabase();
    }

    public void insert(){
    MyOpenHelper oh = new MyOpenHelper(getContext(), "people.db", null, 1);
    SQLiteDatabase db = oh.getWritableDatabase();
    //<!-- $s表示该占位符要求传入字符串,$d表示该占位符要求传入整数 -->
    String sql=String.format("insert into person(name,phone,salary)values(%1$s,%2$d,%3$d)","春晓",138438,13000);
    db.execSQL(sql);
    //或者用如下
    db.execSQL("insert into person(name,phone,salary)values(?,?,?)", new Object[]{"春晓",138438,13000});
    db.close();
    }
    }

    • 删除、修改、查询数据(结构调整)

     --------------------------------------------------------------------------------------------------------------

    public class MyOpenHelper extends SQLiteOpenHelper {

    public MyOpenHelper(Context context) {
    //arg0:上下文
    //arg1:数据库文件名
    //arg2:游标工厂,游标等同于结果集,传NULL使用默认工厂
    //arg3:版本号不能小于1,用于升级
    super(context, "people.db", null, 1);
    }

    //创建数据库时调用
    @Override
    public void onCreate(SQLiteDatabase db) {
    String sql = "create table person(_id integer primary key autoincrement,name char(10),phone char(20),salary integer(10))";
    //创建表
    db.execSQL(sql);
    }

    //升级数据库调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    System.out.println("数据库升级");
    }

    }

    -----------------------------------------------------------------------------------------------------------------------------------

    public class Test extends AndroidTestCase {

    private MyOpenHelper oh;//不能在此NEW此对象,此时测试框架还没有创建,无法提供虚拟上下文
    private SQLiteDatabase db;
    //测试方法执行之前先执行SETUP
    @Override
    protected void setUp() throws Exception {
    super.setUp();
    oh = new MyOpenHelper(getContext());//获取虚拟上下文
    //如果数据库不存在,先创建数据库,再打开;否则直接打开数据库
    db = oh.getWritableDatabase();
    }

     

    //在测试结束之后执行
    @Override
    protected void tearDown() throws Exception {
    super.tearDown();
    db.close();
    }

    public void insert(){
    //<!-- $s表示该占位符要求传入字符串,$d表示该占位符要求传入整数 -->
    String sql=String.format("insert into person(name,phone,salary)values(%1$s,%2$d,%3$d)","春晓",138438,13000);
    db.execSQL(sql);
    //或者用如下
    db.execSQL("insert into person(name,phone,salary)values(?,?,?)", new Object[]{"春晓",138438,13000});
    }

    public void delete(){
    db.execSQL("delete from person where name=?", new Object[]{"春晓"});
    }

     

    public void update(){
    db.execSQL("update person set salary=? where name=?", new Object[]{13200,"春晓"});
    }

    public void select(){
    Cursor cursor = db.rawQuery("select * from person", null);
    //把指针移动到下一行
    while(cursor.moveToNext()){
    //先通过列名获取列索引,然后再获取该列的内容
    String name = cursor.getString(cursor.getColumnIndex("name"));
    }

    }

    --------------------------------------------------------------------------------------------------------

     在实际数据库操作中,基本不用上述方法,而是用谷歌提供的API操作

     

    public void insertApi(){
    ContentValues values = new ContentValues();
    //字段名,值
    values.put("name","杨松");
    values.put("phone","138888");
    values.put("salary","130201");

    //返回值-1,操作失败,第二个参数是values 为空时,给哪个字段插入NULL
    long l=db.insert("person", null, values);
    }

     

    int i = db.delete("person", "_id=?", new String[]{"6"});

    //被修改字段修改后的值
    values.put("name","鲁智深");
    int c = db.update("person", values, "_id=?", new String[]{"5"});

    //表名,字段名(NULL表示所有字段),查询的WHERE条件,WHERE条件的占位符,分组,,排序,分页
    //Cursor cursor=db.query("person", new String[]{"name","phone","salary"}, "_id=?", new String[]{"5"}, null, null, null);
    Cursor cursor=db.query("person", null, null, null, null, null, null);
    while(cursor.moveToNext()){
    String name = cursor.getString(cursor.getColumnIndex("name"));
    String phone = cursor.getString(cursor.getColumnIndex("phone"));
    int salary = cursor.getInt(cursor.getColumnIndex("salary"));
    }

    • 数据库事务操作

    public void transaction(){
    try {
    //开启事务
    db.beginTransaction();
    ContentValues values=new ContentValues();
    values.put("salary", 13199);
    db.update("person", values, "name=?", new String[]{"杨松"});

    values.clear();
    values.put("salary", 13202);
    db.update("person", values, "name=?", new String[]{"春晓"});

    //设置事务执行成功,提交时如果这行代码没有执行过,就会回滚
    db.setTransactionSuccessful();
    } finally {
    //关闭事务,提交数据
    db.endTransaction();
    }
    }

  • 相关阅读:
    16进制节码解析
    批注:modbus_tkdefines.py
    <20211019> Win10不明原因丢失任务提示栏里的Wifi以及网络任务提示栏logo
    <20210926>log: 运行5年3个月的NAS硬盘更换
    Huggingface中的BERT模型的使用方法
    list变量和dict变量前面加*号
    Linux服务器登录阿里网盘下载和上传文件的方法
    【IDEA与git集成】
    【为什么要用 @param注解】
    【我的编程习惯与开发插件】
  • 原文地址:https://www.cnblogs.com/ecollab/p/5883879.html
Copyright © 2011-2022 走看看