目标:是否可以在PC端桌面上使用SQLite数据库制作一个财务文件?

目录:

来源:

实践:

总结和比较:

SQLite数据简介

是什么,内部结构是怎样的,数据库和表的关系是什么

有什么用

常用的操作是什么

SQLite数据库使用

SQLite数据库实践上的优化措施

对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,使我们轻松完成对数据的存取。

步骤1,熟悉创建数据库表,熟悉相关的操作指令,实现对SQLite数据库的感性认识

创建一个包含简单内容的数据库(数据库名)和对应的表(表名);创建表后,可执行简单的“增删改查”指令。

    /**
* <功能描述> 初始化数据库,创建数据库
*
* @return void [返回类型说明]
*/
private void initDataBase() {
mDatabase = openOrCreateDatabase("SqlDemo.db", Context.MODE_PRIVATE,
null);
// CREATE_TABLE = "CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)";
mDatabase.execSQL(CREATE_TABLE);
}

创建数据库的操作调用了execSQL(...),参数代表的是创建数据库指令,其结果会在/data/data/packageName/databases/目录下生成对应的数据库文件,同时执行了在数据库中创建了person的数据表。

步骤2,在数据库中创建数据表,并执行相关的基本操作

    /**
* <功能描述> 执行一些数据库和表的操作
*
* @return void [返回类型说明]
*/
private void doSomeAction() {
Person person = new Person("john", 30);
mDatabase.execSQL("INSERT INTO person VALUES (NULL, ?, ?)",
new Object[] {
person.getName(), person.getAge()
});
person.setName("David");
person.setAge(33);
ContentValues cv = new ContentValues();
cv.put("name", person.getName());
cv.put("age", person.getAge());
mDatabase.insert("person", null, cv);
cv = new ContentValues();
cv.put("age", 35);
mDatabase.update("person", cv, "name=?", new String[] {
"john"
});
Cursor cursor = mDatabase.rawQuery(
"SELECT * FROM person WHERE age >= ?", new String[] {
"33"
});
while (cursor != null && cursor.moveToFirst()) {
int _id = cursor.getInt(cursor.getColumnIndex("_id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.d(TAG, "_id>=" + _id + ", name=>" + name + ", age=>" + age);
}
cursor.close();
mDatabase.delete("person", "age<?", new String[] {
"35"
});
mDatabase.close();
}

粗略地区分对数据库的操作,有以下两种:数据库操作、数据库中数据表的操作。

对于数据库中数据表的操作中,添加、删除和更新可以使用下述两种方式:

public void execSQL(String sql) throws SQLException;
public void execSQL(String sql, Object[] bindArgs) throws SQLException;

上述可以认为是一种统一的形式,执行的是传统数据库操作的指令。

此外,还有对应的可供区分的API方法:

public long insert(String table, String nullColumnHack, ContentValues values);
public int update(String table, ContentValues values, String whereClause, String[] whereArgs);
public int delete(String table, String whereClause, String[] whereArgs);

参数中的table都表示对应数据库中对应table;ContentValues实例values如下内容:

/** Holds the actual values */
private HashMap<String, Object> mValues;

其中Key表示的列名,Values表示的是待写入的内容。参数String whereClause表示WHERE表达式,而String[]则为上述对应占位符的实际参数值。

查询语句相对来说较为复杂,因为工程问题中经常会面对各种各样的查询问题,系统也考虑到了这种复杂性,为我们提供了较为丰富的查询形式:

public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
public Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
public Cursor query(boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal)
public Cursor queryWithFactory(CursorFactory cursorFactory, boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
public Cursor queryWithFactory(CursorFactory cursorFactory, boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit, CancellationSignal cancellationSignal)

此外还有如下四种粗略查询方式:

public Cursor rawQuery(String sql, String[] selectionArgs)
public Cursor rawQuery(String sql, String[] selectionArgs, CancellationSignal cancellationSignal)
public Cursor rawQueryWithFactory(CursorFactory cursorFactory, String sql, String[] selectionArgs, String editTable)
public Cursor rawQueryWithFactory(CursorFactory cursorFactory, String sql, String[] selectionArgs, String editTable, CancellationSignal cancellationSignal)

其中sql字符串,表示一个SQL语句,可以使用占位符代替实际值;而selectionArgs就是占位符的实际参数集合;columns表示要查询的列的所有名称集合;selection表示WHERE之后的条件语句,可以使用占位符。

上述API都会返回Cursor实例,代表数据集的游标。

SQL数据库的灵活使用,更多的是在查询语句中,包含更多的技巧和方法;因为这也是Android UI展示的内容来源。

Cursor的可用方法如下:

c.move(int offset); //以当前位置为参考,移动到指定行
c.moveToFirst(); //移动到第一行
c.moveToLast(); //移动到最后一行
c.moveToPosition(int position); //移动到指定行
c.moveToPrevious(); //移动到前一行
c.moveToNext(); //移动到下一行
c.isFirst(); //是否指向第一条
c.isLast(); //是否指向最后一条
c.isBeforeFirst(); //是否指向第一条之前
c.isAfterLast(); //是否指向最后一条之后
c.isNull(int columnIndex); //指定列是否为空(列基数为0)
c.isClosed(); //游标是否已关闭
c.getCount(); //返回总数据项数(行数)
c.getPosition(); //返回当前游标所指向的行数
c.getColumnIndex(String columnName);//返回某列名对应的列索引值
c.getString(int columnIndex); //返回当前行指定列的值

获取内容则是使用如下API:

byte[] getBlob(int columnIndex);
String getString(int columnIndex);
short getShort(int columnIndex);
int getInt(int columnIndex);
long getLong(int columnIndex);
float getFloat(int columnIndex);
double getDouble(int columnIndex);

步骤3:实际开发对上述操作做改进,以更方便开发流程。

在实际开发中,为了更好地管理和维护数据库,会封装一个继承自SQLiteOpenHelper类的数据库操作管理类,然后以这个类为基础再封装自己的业务逻辑。

A helper class to manage database creation and version management.

Android数据存储引擎---SQLite数据库的更多相关文章

  1. Android数据存储之SQLite数据库

    Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...

  2. Android 数据存储之 SQLite数据库存储

    ----------------------------------------SQLite数据库---------------------------------------------- SQLi ...

  3. 【Android 应用开发】Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

  4. Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

  5. Android数据存储之SQLite 数据库学习

    Android提供了五种存取数据的方式 (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQLite数据库,存放各种数据, ...

  6. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  7. Android数据存储:SQLite

    Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ...

  8. 【转载】Android数据存储之SQLite

    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...

  9. Android数据存储之SQLite使用

    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...

随机推荐

  1. 第七篇--ubuntu18.04下面特殊符号

    按住键盘win键,在搜索框输入“字符”,弹出来的工具点进去 需要什么符号就找什么符号,然后点击它复制就好.

  2. Go语言系列(八)- Goroute和Channel

    一.Goroute 1. 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配合调度的一个独立单位 B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能 ...

  3. Java基础知识拾遗(一)

    类型提升规则 Java定义了几个应用于表达式的类型提升规则:所有byte.short和char类型的值都被提升为int类型.如果有一个操作数是long类型,将这个表达式提升为 long 类型:如果有一 ...

  4. 为Nexus配置阿里云代理仓库

    Nexus默认远程仓库为https://repo1.maven.org/maven2/ 慢死,还常连不上. 可以添加阿里云代理仓库 URL:http://maven.aliyun.com/nexus/ ...

  5. 算法第四版Question

    1.ECLIPES标准输入流 ①Run As-->Run Configurations-->Commom-->Input File在Input File里面输入要读取的文本文件 这对 ...

  6. Collections.unmodifiableMap(Map map)

    public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m)返回指定映射 ...

  7. MySQL学习8 - 数据的增删改

    一.介绍 二.插入数据 INSERT 三.更新数据UPDATE 四.删除数据DELETE 一.介绍 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现 ...

  8. BMP文件解析

    目录 BMP文件简介 BMP文件格式 位图头 位图信息 调色板 位图数据 C语言代码 获取文件大小 获取文件尺寸 获取文件偏移量 读取文件数据示例 一个问题 完整程序 BMP文件简介 BMP(全称Bi ...

  9. 使用Roslyn编译项目的示例

    using System; using System.Collections.Generic; using System.IO; using Microsoft.CodeAnalysis; using ...

  10. PageUtil.java分页工具类

    package com.chabansheng.util; /** * 分页工具类 * @author Administrator * */ public class PageUtil { /** * ...