相对于server端庞大的oracle等数据库,sqlite是一个小巧轻便的数据库。它不需要配置,直接安装使用命令或者可视化工具,没有服务器,不需要管理,重要的是非常轻量,但提供了完整的sql查询功能,是非常适合移动开发存储读取数据的一个轻量型数据库,是学习android的必要了解知识。
1、安装
SQLite Home Page - SQLite 官方下载网站
根据需要下载dll 和tools,如windows环境下载 选择32位或64位dll,然后下载tools
将dll和tools解压到同一个文件夹中,得到
如上图,1即是我们使用的sqlite命令程序,为了方便,可以选择配置home和环境变量。这里不再赘述。执行sqlite3.exe ,进入sqlite命令模式。其实下载了sdk的会发现platform-tools下已经有sqlite3工具了。
常用命令
1.创建数据库 >sqlite3 test.db 如果数据库已存在,则直接进入该数据库。不存在则创建后进入数据库
2.显示数据库 >.database
3.退出命令模式 >.exit
4.查看帮助>.help
5. 设置输出格式>.mode list|column|insert|line|tabs|tcl|csv 可试验查看
6.显示所有表>.tables
其他就是基础的sql知识。建表,增删改查等。习惯可视化工具的可使用SQLiteStudio、火狐SQLite Manager插件等
2、数据库多种方式数据写入
sqlite数据库的文件名为.db。我们经常能从客户那里得到excel等格式数据库,这里简单介绍下数据导入的方式。
2.1 excel数据转换
常用的是通过csv格式来进行数据导入的。我发现表头(列名)是不能导入作为列字段的,可先建表结构再导数据。
excel转csv就是简单的另存为,选择csv格式即可。有中文的时候注意用文本工具打开保存为utf-8编码。
导入的过程可以使用工具或命令行。工具一般都有import data to table选择csv格式。命令行在数据量大的时候推 荐。示例:
sqlite3 test.db
sqlite> .import test.csv test
2.2 其他数据库
其他数据库的数据,如oracle、mysql等都是通过csv格式来转换的。通过工具导出csv格式文件,然后同上面步骤即 可。
3、android操作SQLite
android提供了操作SQLite的api。主要的类分别是SQLiteDatabase、SQLiteOpenHelper两个。
3.1 SQLiteDatabase
SQLiteDatabase看做是一个数据库对象,可进行数据的增删改查。
常用方法:
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) 打开或创建数据库 path 数据库创 建的路径 factory 设为null即可
execSQL() 执行SQL语句
insert(String table,String nullColumnHack,ContentValues values) 插入表数据,可以用execSQL加上sql语句代替
delete(String table,String whereClause,String[] whereArgs) 根据where条件删除数据
update(String table,ContentValues values,String whereClause, String[] whereArgs) 根据where条件更新数据
Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit); columns表示查询字段 selection和args组合表示条件 groupby和having表示分 组和条件 orderby表示排序 limit表示分页 。这个方法可以替换为Cursor rawquery(String sql),两个方法只是长拼接 sql 和简单拼接sql的区别,最终调用的是同一个方法。
SQLiteOpenHelper是一个抽象类,需要继承它并实现它的几个回调函数这个类中可重写数据库创建、更新、删除、新增事件。
接下来会举一个完整的例子。
我们创建一个内部存储数据库,实现对它的增删改查。代码中还包括了读取外部存储的一个数据库代码实现
package com.example.testrawasset.sqlite;
import java.io.File;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.os.Environment;
public class SqliteActivity extends Activity {
MySQLiteOpenHelper mySQLiteOpenHelper;
SQLiteDatabase sqliteDatabase;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mySQLiteOpenHelper = new MySQLiteOpenHelper(this);
sqliteDatabase = mySQLiteOpenHelper.getWritableDatabase();
try {
// 1 插入数据
ContentValues cv = new ContentValues();
cv.put("name", "one");
cv.put("age", 18);
sqliteDatabase.insert("person", null, cv);
cv = new ContentValues();
cv.put("name", "two");
cv.put("age", 19);
sqliteDatabase.insert("person", null, cv);
// 2 删除数据
sqliteDatabase.delete("person", "name=?", new String[] { "one" });
// 3 更新数据
cv = new ContentValues();
cv.put("name", "two");
cv.put("age", 20);
sqliteDatabase.update("person", cv, "name=?",
new String[] { "two" });
// 4查询
Cursor cur = sqliteDatabase.rawQuery("select * from person", null);
if (null != cur) {
while (cur.moveToNext()) {
// cursor index从0开始
System.out.println(cur.getInt(0) + "name:"
+ cur.getString(1) + "age:" + cur.getInt(2));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 最后一定要关闭数据库连接
sqliteDatabase.close();
mySQLiteOpenHelper.close();
}
}
public final static String TAG = "SQLite";
public final static String dbname = "test.db";
/**
* 从存储卡读取test数据库
*/
class SdSQLiteOpenHelper extends SQLiteOpenHelper {
File f;
public SdSQLiteOpenHelper(Context context) {
super(context, dbname, null, 2);
f = new File(Environment.getExternalStorageDirectory() +"/test/"+ dbname);
}
@Override
public void onCreate(SQLiteDatabase db) {
db = SQLiteDatabase.openOrCreateDatabase(f, null);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public SQLiteDatabase getWritableDatabase() {
SQLiteDatabase db = null;
if(f.exists()){
db = SQLiteDatabase.openOrCreateDatabase(f, null);
}
return db;
}
}
class MySQLiteOpenHelper extends SQLiteOpenHelper {
/**
* SQLiteOpenHelper(Context context, String name, CursorFactory factory,
* int version) context上下文 name数据库名称 factory游标(设为null)
* version版本(用于update判断) 该方法实现在/data/data/应用程序名/databases路径下创建名为name的数据库
* 调用该对象的getWritableDatabase 或 getReadableDatabase方法
* 即可获得SQLiteDatabase数据库对象
*
*/
public MySQLiteOpenHelper(Context context) {
super(context, dbname, null, 1);
}
/**
* 必须实现 oncreate方法。方法中可进行表的创建,如下
*/
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table person(id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER)";
db.execSQL(sql);
}
/**
* 数据库更新触发事件 当打开数据库时传入的版本号与当前的版本号不同时会调用该方法
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}