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进行增删改查的操作。
时间: 2024-08-07 20:53:01

Android数据库SQLite的相关文章

Android数据库SQLite表内设置外键

Android数据库SQLite表内设置外键 介绍 Android默认的数据是SQLite,但SQLite3.6.19之前(在2.2版本中使用的是3.6.22,因此如果你的应用只兼容到2.2版本就可以放心使用外键功能)是不支持外键的,如果有两张表需要关联,用外键是最省事的,但不支持的话怎么办呢?这里就有一个解决办法,就是用事务将两张表关联起来,并且最后生成一张视图. 现有两张表 Employees Dept 视图 ViewEmps:显示雇员信息和他所在的部门 创建数据库 自定义一个辅助类继承SQ

Android 数据库 SQLite

首先关于SQLite的介绍百度上看看就大致了解的差不多了. Android 操作数据库的关键步骤就在于实现API SQLiteOpenHelper,通常这个库辅助类来创建或打开数据库. 废话不多说直接上代码解释吧: 1 public class PersonDBOpenHelper extends SQLiteOpenHelper { 2 //context 上下文 3 //第二个是名字,如果名字空 为内存数据库 数据库名字 4 //CursorFactory 游标工厂 5 //version

学习Android数据库SQLite的笔记

使用SQLiteOpenHelper类操作数据库是官方提供的一个官方帮助类,操作数据库要使用到SQLiteDatabase,可以通过getReadableDatabase()或getWritableDatabase()获取,这两个方法都可以打开或创建一个数据库,不同的是当磁盘空间已满等情况造成的数据库不可写,getReadableDatabase()是可以成功打开数据库的,但只可以读取数据库,而使用getWritableDatabase()则会直接抛出异常. 首先必须创建一个继承SQLiteOp

Android数据库(sqlite)加密方案

最近因为一些项目的安全性需要将数据库加密,一开始想到的就是先将数据库通过AES加密,然后运行时再解密,另一种是将数据库里的内容加密. 很快这两种方案都是不理想的,第一种加密方式形同虚设,第二种,如果加密的字段是要查找数据就变得麻烦. 所以第三种方案就是在内存里解密,在网上查到SQLITE是支持加密的, 所以就根据网上的指导一步步地将SQLITE编译成支持加密的. 那下一步就是怎样做成SDK去方便使用?第一个念头就是将原生的数据库使用方式移植过来,但做起来比开始想像的难了点,但最终也在修修补补中完

转载-Android数据库高手秘籍(一)——SQLite命令

原文地址: http://blog.csdn.net/guolin_blog/article/details/38461239 Android数据库高手秘籍(一)——SQLite命令 分类: Android数据库高手秘籍2014-09-04 09:10 7310人阅读 评论(42) 收藏 举报 Android数据库SQLite高手秘籍LitePal 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38461239 要想熟练地操作任

Unity3D在Android平台使用嵌入式数据库Sqlite,解决无法找到数据库文件的问题

做一个需要嵌入式数据库Sqlite 的unity3d项目,在pc机上运行良好,需要发布到Android平台上,于是,各种坑爹...会遇到找不到数据库文件的问题.当在pc机上使用sqlite时,当执行SqliteConnection dbConnection = new SqliteConnection("data source = test.db");语句时,如果有这个数据库文件则建立连接,如果没有则创建出这个文件,然后建立连接.当在Android平台上时,扯淡的事情就开始了,总之便不

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存

Android - 插入数据库(SQLite)错误

插入数据库(SQLite)错误 本文地址: http://blog.csdn.net/caroline_wendy Error: android.database.sqlite.SQLiteException: no such table: step (code 1): ,  while compiling: INSERT INTO step(duration,date,counter) VALUES (?,?,?). 错误:插入数据库错误,没有找到表,插入表的地方写入参数,而参数地方传入空值.

基础篇:6.Android数据库编程---SQLite

简介: 在Android平台上,继承了一个嵌入式关系型数据库---SQLite.SQLite具有跨平台特性,可以在所有主要的操作系统上运行.SQLite通过独占性和共享锁实现独立事务处理,因此多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据,在进行写操作之前,必须先获得独占锁.另一方面,SQLite采取动态数据类型,当某个值插入数据库时,SQLite会检查它的类型,如果该类型与所关联的列不匹配,SQLite则会进行强制转换.SQLite支持以下几种数据类型:NULL(空值).I