移动平台青睐的数据库-SQLite

相对于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) {

		}

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值