Android存储方式二:sqlite数据库

news/2024/7/7 16:48:11

说明

应用运行需要保存一系列有一定结构的数据, 比如说公司员工信息

文件类型: .db

数据保存的路径: /data/data/projectPackage/databases/xxx.db

默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提供其它应用操作

应用卸载时会删除此数据

sqlite数据库

SQLite (http://www.sqlite.org/),是一款轻型的关系型数据库服务器, 移动设备的数据库存储都使用SQLite, 它的特点:

安装文件小: 最小只有几百K, Android系统已经安装

支持多操作系统: Android, WP, IOS, Windows, Linux等

支持多语言: 比如 Java 、 PHP、C#等.

处理速度快: 处理速度比Mysql, Oracle, SqlServer都要快(数据量不是特别大)

Sqlite中的一个数据库就是一个.db文件(本质上.db的后缀都可以不指定)

数据类型

Sqlite支持的数据类型与Mysql相似, 常用的数据类型:

INT/INTEGER : 整数

FLOAT/DOUBLE : 小数

CHAR/VARCHAR/TEXT : 字符串文本

BLOB : 文件

DATE/ DATETIME : 日期/日期时间

Sqlite建表

Sqlite操作数据库的sql语句基本与mysql一样, 但需要注意下面2个点:

最大的不同在于创建表时可以不用指定字段类型, Sqlite可以适时的自动转换, 但除varchar类型外最好指定类型

Sqlite中的主键最名称建议使用_id

 create table employee (
   _id integer primary key autoincrement, /*主键,自增长*/
   name varchar,                /*字符串*/
   salary double,                                /*小数*/
   birthday date                                /*日期, 可直接插入日期格式字符串*/
 )

sqlite的crud语句

 /*插入*/
 INSERT INTO employee (name,salary,birthday) VALUES('Tom', 8000, '1988-09-21');
 /*删除*/
 DELETE FROM employee WHERE _id=2 
 /*更新*/
 UPDATE employee SET name='Jack',salary=salary+1000 WHERE _id=1
 /*查找*/
 SELECT * FROM employee where _id=3

相关API

SQLiteOpenHelper: 数据库操作的抽象帮助类

  SQLiteOpenHelper(Context context, String name, 
       CursorFactory factory, int version) : 构造方法, 指定数据库文件名和版本号
  abstract void onCreate(SQLiteDatabase db) : 用于创建表
  abstract void onUpgrade() : 用于版本更新
  SqliteDatabase getReadableDatabase() : 得到数据库连接

SqliteDatabase: 代表与数据库的连接的类

   long insert(): 用于执行insert SQL, 返回id值
   int update(): 用于执行update SQL
   int delete(): 用于执行delete SQL
   Cursor query(): 用于执行select SQL, 返回包含查询结果数据的Cursor
   void execSql(sql) : 执行sql语句

   beginTransaction(): 开启事务
   setTransactionSuccessful(): 设置事务是成功的
   endTransaction(): 结束事务, 可能提交事务或回滚事务
   openDatabase(String path, CursorFactory factory, int flags):  得到数据库连接

Cursor : 包含所有查询结果记录的结果集对象(光标,游标)

int getCount() : 匹配的总记录数
boolean moveToNext() : 将游标移动到下一条记录的前面
Xxx getXxx(columnIndex) : 根据字段下标得到对应值
int getColumnIndex(columnname): 根据字段名得到对应的下标

案列

首先第一步创建一个帮助类

public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context, int version) {
    super(context, "dongge.db", null, version);
}

/**
 * 什么时候才会创建数据库文件?
 * 1). 数据库文件不存在
 * 2). 连接数据库
 * 什么时候调用?
 * 当数据库文件创建时调用(1次)
 * 在此方法中做什么?
 * 建表
 * 插入一些初始化数据
 */
@Override
public void onCreate(SQLiteDatabase db) {
    Log.e("TAG", "DBHelper onCreate()");
    //建表
    String sql = "create table person( _id integer primary key autoincrement,name varchar,age int)";
    db.execSQL(sql);
    //插入一些初始化数据
    db.execSQL("insert into person(name,age) value ('Tom1',21)");
    db.execSQL("insert into person(name,age) value ('Tom2',22)");
    db.execSQL("insert into person(name,age) value ('Tom3',23)");
}

//当传入的版本号大于数据库的版本号时调用
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.e("TAG", "DBHelper onUpgrade()");
}
}

创建表

    DBHelper dbHelper = new DBHelper(this, 1);
    SQLiteDatabase database = dbHelper.getReadableDatabase();//与数据库建立连接
    Toast.makeText(this, "创建数据库", Toast.LENGTH_SHORT).show();

更新表

 public void testUpdateDB(View v) {
    DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();

    Toast.makeText(this, "更新数据库", Toast.LENGTH_SHORT).show();
}

插入数据库

     DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    //执行插入语句
    ContentValues values = new ContentValues();
    values.put("name", "jack");
    values.put("age", 18);
    long id = database.insert("person", null, values);
    //关闭连接
    database.close();
    //提示
    Toast.makeText(this, "id==" + id, Toast.LENGTH_SHORT).show();

更新数据库

     DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    //执行插入语句
    ContentValues values = new ContentValues();
    values.put("name", "jack2");
    values.put("age", 20);
    int updateCount = database.update("person", values, "_id=?", new String[]{"4"});
    database.close();
    Toast.makeText(this, "updateCount==" + updateCount, Toast.LENGTH_SHORT).show();

删除数据

   DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    //执行删除语句
    int delete_id = database.delete("person", "_id=?", new String[]{"2"});
    //关闭数据库
    database.close();
    Toast.makeText(this, "delete_id==" + delete_id, Toast.LENGTH_SHORT).show();

查询语句

     DBHelper dbHelper = new DBHelper(this, 2);
    //获取连接
    SQLiteDatabase database = dbHelper.getReadableDatabase();
    //执行查询语句
    //Cursor cursor = database.query("person", null, null, null, null, null, null);//查询所有数据
    Cursor cursor = database.query("person", null, "_id=?", new String[]{"3"}, null, null, null);//查询所有数据
    //得到匹配的记录数
    int count = cursor.getCount();
    Log.e("TAG", String.valueOf(count));
    while (cursor.moveToNext()) {
        int id = cursor.getInt(0);
        String name = cursor.getString(1);
        int age = cursor.getInt(cursor.getColumnIndex("age"));
        Log.e("TAG", "id=" + id + ";age=" + age + ";name=" + name);
    }
    //关闭
    cursor.close();
    database.close();

测试事务处理

一个功能中对数据库进行的多个操作: 要就是都成功要就都失败

事务处理的3步:

 * 1. 开启事务(获取连接后)
 * 2. 设置事务成功(在全部正常执行完后)
 * 3. 结束事务(finally中)

    SQLiteDatabase database = null;
    int updateCount = 0;
    try {
        DBHelper dbHelper = new DBHelper(this, 2);
        //获取连接
        database = dbHelper.getReadableDatabase();
        //开启事务(连接成功后)
        database.beginTransaction();
        //执行更新第一条语句
        ContentValues values = new ContentValues();
        values.put("age", 110);
        updateCount = database.update("person", values, "_id=?", new String[]{"1"});
        //出现异常
        boolean isFlage = true;
        if (isFlage) {
            throw new RuntimeException("出异常了");
        }
        //执行更新第二条语句
        values = new ContentValues();
        values.put("age", 200);
        int updateCount2 = database.update("person", values, "_id=?", new String[]{"3"});
        //2. 设置事务成功(在全部正常执行完后)
        database.setTransactionSuccessful();
    } catch (RuntimeException e) {
        e.printStackTrace();
        Toast.makeText(this, "出异常啦!!!", Toast.LENGTH_SHORT).show();

    } finally {
        //结束事务
        database.endTransaction();
        database.close();
    }

}

http://www.niftyadmin.cn/n/3648995.html

相关文章

事件机制分发

相关API 1. MotionEvent : 触屏事件 int ACTION_DOWN0 : 代表down int ACTION_MOVE2 ; 代表move int ACTION_UP1 : 代表up getAction() : 得到事件类型值 getX() : 得到事件发生的x轴坐标(相对于当前视图) getRawX() :得到事件发生的x轴坐标(相对于屏幕左顶点) getY() …

Android TabActivity的生命周期

在TabActivity中,只在第一次进入时走了onCreate()、onStart()、onResume()三个阶段,然后在退出该页面时走了onPause()、onStop()和onDestroy()两个阶段。其他时间无论其中的子Activity如何切换,都不会再进入TabActivity的生命周期。 而子Acti…

three.js使用svg_如何使用SVG和anime.js构建弹性范围输入

three.js使用svg介绍 (Introduction) In HTML5, many new types of input attributes were introduced for the form element, such as color, date, range, and many more. Although functionally these new types of input works, they often do not meet the aesthetic need…

我们正处在IT殖民时代,需要突破的勇气,或者就这样继续下去...

IT殖民地,似乎有点危言耸听。但是从客观的事实来看,这个称呼并不离奇,尤其在企业级市场上(IT消费品市场还好些)。我们的操作系统都是Windows、AIX、HP-UX、Solaris,Redhat Linux,SuSE Linux&…

Android 使用Fragment 替换 TabActivity

可以分为下面的几部分: 使用支持库 创建一个Fragment 创建一个动态UI 多个Fragment之间的通信 1、使用支持库 如果您的应用需要运行在3.0及以上的版本,可以忽略这部分内容。 如果您的应用使用在3.0以下、1.6及以上的版本,需要使用支持库来…

如何在Visual Studio Code中使用Live Share

介绍 (Introduction) Live Share is an extension for VS Code that enables real-time collaboration between developers. It gives users the ability to share a session with someone else, allowing them to edit code as well as share a sever and debugging session. …

四大组件之service简单介绍和AIDL的简单使用

Service是什么 1.Service是一个应用组件, 它用来在后台完成一个时间跨度比较大的工作且没有关联任何界面 2.一个Service可以完成下面这些工作:访问网络 播放音乐 文件IO操作 大数据量的数据库操作 …… 3. 服务的特点: Service在后台运行,不用与用户进行交互 …

[收藏]五种提高 SQL 性能的方法

五种提高 SQL 性能的方法发布日期: 4/1/2004| 更新日期: 4/1/2004Johnny Papa Data Points Archive 有时, 为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整。啊,但关键在于确定如何进行调整&a…