zoukankan      html  css  js  c++  java
  • Android数据库SQLite

    数据库

    数据库增删改查

    添加

    insert into info (name,phone) values ('zhangsan','110')

    删除

    delete from info where name='zhangsan'

    修改

    update info set phone ='999' where name ='zhangsan'

    查询

    select * from info where name='zhangsan'

    Android下数据库增删改查

    • void - db.execSQL() 增删改
    • cursor - db.rawQuery() 查询

    注意:操作数据库 一定要记得把数据库**连接**给关闭掉。 cursor 用完后,也记得关闭

    getReadableDatabase() getWriteableDatabase()返回的是同一个数据库的实例, 区别就是数据库返回的时候是否加锁。

    利用sqlite3工具查看数据库的内容

    sqlite3 xxx.db

    如果出现中文乱码 需要修改cmd的编码集

    65001 utf-8

    chcp 65001 更改cmd窗口的编码,默认是gb2312

    Android下创建数据库步骤

    1. 类继承SQLiteOpenHelper(数据创建的帮助类,oncreate,onUpgrade)

    生成构造方法

            /**
         * 创建一个数据库帮助类,去创建/打开/管理 数据库
         * @param context   上下文
         * @param name  设置数据库名称
         * @param factory   CursorFactory 定义一个结果集,游标工厂。
         *                      Cursor 游标(结果集,保存了对数据库的引用,指针)
         *                      设置为null,表示调用默认游标        
         * @param version   数据库的版本,从1开始
         */
        public MySqliteDB(Context context, String name, CursorFactory factory,
                int version) {
            super(context, name, factory, version);
            // TODO Auto-generated constructor stub
        }
    
    1. 重写onCreate(SQLiteDatabase db)方法 ,数据库第一次被创建的时候调用的方法。适合数据库表结构的初始化.

      create table info (_id integer primary key autoincrement, name varchar(20), phone varchar(20))

    2. 重写onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),数据库被更新的时候调用的方法.数据库的版本号增加的时候调用。

    3. 添加helper类的构造方法。 指定数据库的名称,版本号,游标工厂默认null

    数据库文件创建的位置

    /data/data/包名/databases/xxx.db

    数据库在创建的时候不指定里面的内容,默认创建只有一张表 metadata保存系统语言环境。

    Cursor 游标

    • 保存了对数据库的引用,指针。设置为null,表示调用默认游标。
    • 默认起始位置为-1
    • 常用方法:

      boolean move(int offset) 
      
            Move the cursor by a relative amount, forward or backward, from the current position. 
      
       boolean moveToFirst() 
      
            Move the cursor to the first row. 
      
       boolean moveToLast() 
      
            Move the cursor to the last row. 
      
       boolean moveToNext() 
      
            Move the cursor to the next row. 
      
       boolean moveToPosition(int position) 
      
            Move the cursor to an absolute position. 
      
       boolean moveToPrevious() 
      
            Move the cursor to the previous row. 
      

    如何防止SQL语句注入

    方法:绑定参数

    //示例
    xx.exeSQL("insert into person(name,age) values (?,?)",new Object[]{name,age})
    

    sqlite3的命令

    • sqlite3 <数据库名> 查看数据库,进入sqlite模式
    • .tables 查看所有表
    • .mode column | list | insert | line | tabs | tcl | csv 改变输出格式
    • .schema 查看库中所有表的DDL语句
    • .headers on/off 显示表头 默认off
    • .nullValueNULL 空值数据显示问题
    • .dump<表名> 生成形成表的SQL脚本
    • .dump 生成整个数据库的SQL脚本
    • .exit 退出
    • .help 查看帮助

    (重点)类 SQLiteDatabase(API实现数据库的正删改查)

    插入数据

     long insert(String table, String nullColumnHack, ContentValues values) 
    
              Convenience method for inserting a row into the database. 
    

    删除数据

     int delete(String table, String whereClause, String[] whereArgs) 
    
              Convenience method for deleting rows in the database. 
    

    修改数据

     int update(String table, ContentValues values, String whereClause, String[] whereArgs) 
    
              Convenience method for updating rows in the database. 
    

    查询数据

     Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 
    
              Query the given URL, returning a Cursor over the result set. 
    
     Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) 
    
              Query the given table, returning a Cursor over the result set. 
    
     Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 
    
              Query the given table, returning a Cursor over the result set. 
    

    两种增删改查方法的优缺点

    • 自己写sql语句
      • 自由度高,灵活
      • 效率高,资源占用小
      • 可以实现表的级联查询
    • google的现成API
      • 方便,不易出错
      • 资源开销比较大,效率稍低
        • 有返回值

    (重点)数据库的事务

    优点:安全,高效

    保证操作要么同时成功,要么同时失败。 银行转账

    A->B 汇款 A - 100块 B + 100块

    事务的模板代码

          //开启事务
          db.beginTransaction();
           try {
             ...
             处理业务逻辑A
             ...
             //设置成功(回滚)点,即要么全成功要么全失败
             db.setTransactionSuccessful();
             ...
             处理业务逻辑B
             ...
             //设置成功(回滚)点。(同时操作若干个动作时可以设置多个成功点)
             db.setTransactionSuccessful();
             ...
           } finally {
            //结束事务
             db.endTransaction();
            //千万不要忘记干掉这个
            db.close();
           }
    

    (重点)数据库的内容同步显示到界面(ListView)。

    listview工作的原理

    mvc 设计模式。 * model 数据模型 Person * view 视图 ListView * controller 控制器 Adapter 数据适配器,将数据集合以特定的方式组织到界面上

    自己理解: ListView + Adapter机制,在需要的时候去创建TextView对象 根据当前屏幕可显示的条数去创建对象,显示过去(之前在屏幕中出现,然后又消失的条目)的条目对象会被重新赋予新值(即显示出的新的条目)

    Listview 使用步骤

    • 写ui界面 xml文件 ListView
    • 寻找listview
    • 实现listview的数据适配器 adapter
    • 给listview设置adapter,一旦设置了adapter,就会从这个方法索要View

    开发的时候如何自定义数据适配器,实现复杂的ui界面。

    • 定义listview布局
    • 查找listview
    • 自定义一个复杂BaseAdapter
      • getCount();返回有多少个条目 List.SIZE()
      • getView();返回每个条目的view对象

        定义一个xml文件 View view = View.inflate(MainActivity.this, R.layout.rl_item, null); 修改view对象里面子孩子显示的内容 view.findViewById();

    • 给listview设置adapter

    (重点)打气筒——LayoutInflater

    如何将XML数据(布局文件)转换成View对象? 将一个XML的布局文件填充成一个View对象,以便添加到其他 View容器中。

    SimpleAdapter —— 显示图片文本信息 ArrayAdapter —— 只能显示图片

    Android对话框

    Builder

    • 通知对话框

    • 列表对话框

    • 单选对话框

    • 多选对话框

    ProgressDialog * 进度对话框


    整理补充:

    内容提供者

    数据库文件 一般是私有的。 -rw-rw- --- 别的应用程序是没办法访问私有的数据库。

    目的: 保证应用程序数据的安全。每个应用程序都是独立的,不可以操作另外一个应用程序数据库的数据。

    有一些特殊的需求,需要把自己私有的数据库暴露给别的应用程序让别的应用程序访问。

    内容提供者就是做这个事情的。

    内容提供者创建的步骤 (理解原理

    • DaYifuProvider extend ContentProvider
    • 在清单文件.xml里面配置 内容提供者。配置完整类路径,主机名。 android:name="com.itheima.db.DaYifuProvider" android:authorities="com.itheima.db.persondb"
    • DaYifuProvider 定义出来一些数据操作的uri 利用uriMatcher 指定一些特殊的路径 content://com.itheima.db.persondb/query 查询 content://com.itheima.db.persondb/insert 添加 content://com.itheima.db.persondb/delete 删除 content://com.itheima.db.persondb/update 更新
    • 实现DaYifuProvider 增删改查的方法。 根据业务需求去实现。 实现了query方法, 1.检查路径uri是否正确。 2.如果正确返回cursor 3.如果不正确抛出异常。

    如何使用内容提供者查询数据

    1. 获取内容提供者的解析器 ContentResolver resolver = getContentResolver();
    2. 使用resolver进行增删改查的操作。
  • 相关阅读:
    3.25Java常量
    3.26Java逻辑运算符
    3.26Java关系运算符
    Java标识符
    3.27Java位运算符
    3.26Java运算符(operator)
    3.26Java字符型(char)变量、常量
    3.26Java布尔类型(boolean)变量、常量
    《算法导论》第9章 顺序统计学 (1)最小值和最大值
    《算法导论》第8章 线性时间排序 (1)计数排序
  • 原文地址:https://www.cnblogs.com/istarry/p/4421091.html
Copyright © 2011-2022 走看看