Android开发手记(18) 数据存储三 SQLite存储数据

时间:2023-01-29 17:12:40

Android为数据存储提供了五种方式:

1、SharedPreferences

2、文件存储

3、SQLite数据库

4、ContentProvider

5、网络存储

SQLite 是以嵌入式为目的而设计的轻型数据库,运行起来占用的资源非常低,通常只需要几百K的内存就足够了。同时也具有非常好的兼容性,支持标准SQL语言。Android提供了对SQLite的支持,我们可以通过其来管理一些应用数据。

一、创建SQLite数据库和表

我们可以通过SQLiteDatabase.openOrCreateDatabase()来创建一个数据库实例。

SQLiteDatabase db = openOrCreateDatabase(dbName, MODE_PRIVATE, null);
// openOrCreateDatabase(String name, int mode, CursorFactory factory)
// 第一个参数为创建数据库的名称
// 第二个参数为创建数据库的权限,其权限同内部文件存储数据权限相同。默认为MODE_PRIVATE。
// 第三个参数为CursorFactory对象,用于查询时返回Cursor的子类对象;或者传入null使用默认的factory构造。

在创建表的时候,我们可以使用一条SQL语句来完成。

cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
db.execSQL(cmd);

这样,我们可以发现在“/data/data/[PACKAGE_NAME]/databases”目录下生成了一个“myDB.db”数据库文件。

完整代码:

import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button btnDB;
private Button btnTable;
private String dbName = "myDB";
private String cmd = "";
private SQLiteDatabase db; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnDB = (Button)findViewById(R.id.btnDB);
btnTable = (Button)findViewById(R.id.btnTable); btnDB.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
db = openOrCreateDatabase(dbName,MODE_PRIVATE,null);
}
});
btnTable.setOnClickListener(new View.OnClickListener() {
String tableName = "User";
@Override
public void onClick(View view) {
cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
db.execSQL(cmd);
}
}); }
}

二、添加、删除、修改

(1)SQL语句方法

cmd = "INSERT INTO " + tableName + " values ('Amy','123456')";
db.execSQL(cmd);
cmd = "UPDATE " + tableName + " SET passwd='654321' WHERE name='AMY')";
db.execSQL(cmd);
cmd = "DELETE FROM " + tableName + " WHERE name='Amy'";
db.execSQL(cmd);

(2)另一种方法

db.insert(String table, String nullColumnHack, ContentValues values);
db.update(String table, Contentvalues values, String whereClause, String whereArgs);
db.delete(String table, String whereClause, String whereArgs);

以上三个方法的第一个参数都是表示要操作的表名;insert中的第二个参数表示如果插入的数据每一列都为空的话,需要指定此行中某一列的名称,系统将此列设置为NULL,不至于出现错误;insert中的第三个参数是ContentValues类型的变量,是键值对组成的Map,key代表列名,value代表该列要插入的值;update的第二个参数也很类似,只不过它是更新该字段key为最新的value值,第三个参数whereClause表示WHERE表达式,比如“age > ? and age < ?”等,最后的whereArgs参数是占位符的实际参数值;delete方法的参数也是一样。

实例:

	btnTable.setOnClickListener(new View.OnClickListener() {
String tableName = "User"; @Override
public void onClick(View view) {
cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
db.execSQL(cmd); ContentValues cv = new ContentValues();
cv.put("name", "Amy");
cv.put("passwd", "123456");
db.insert(dbName, null, cv);
// cmd = "INSERT INTO " + tableName + " values ('Amy','123456')";
// db.execSQL(cmd); cv = new ContentValues();
cv.put("passwd", "654321");
db.update(dbName, cv, "name=?", new String[]{"Amy"});
// cmd = "UPDATE " + tableName + " SET passwd='654321' WHERE name='AMY')";
// db.execSQL(cmd); db.delete(dbName, "name=?", new String[]{"Amy"});
// cmd = "DELETE FROM " + tableName + " WHERE name='Amy'";
// db.execSQL(cmd);
}
});

三、数据库查询

对数据库的查询可以通过db.query()来实现,query方法一般包含8个参数:

db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit);
// table为查询表的名称
// columns为查询的字段名
// selection为查询的条件
// selectionArgs为查询条件的值
// groupBy为分组字段值
// having为分组后筛选条件
// orderBy为排序字段名
// limit为查询结果返回记录条数

     查询的的结果通过Cursor返回。代表数据集的游标。

		Cursor cursor = db.query(tableName, null, null, null, null, null, null);
String str = "";
if(cursor.getCount()!=0){ // 查询符合条件的记录个数
cursor.moveToFirst(); // 移动到第一个记录
for(int i=0; i<cursor.getCount();i++){
str += cursor.getString(0)+" "+cursor.getString(1)+"\n";
cursor.moveToNext(); // 移动到下一个记录
}
}
new AlertDialog.Builder(MainActivity.this).setTitle("Query")
.setMessage(str).setNegativeButton("OK",null).show();

四、SQLiteOpenHelper

除了常规的管理方法之外,Android SDK还提供了另外一种管理数据库的方法,SQLiteOpenHelper。它提供了一套自动执行的机制来创建、更新、打开数据库。

首先,我们继承SQLiteOpenHelper类,创建MyDBHelper类。

public class MyDBHelper extends SQLiteOpenHelper {
private String tableName = "User"; public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
} public void onCreate(SQLiteDatabase db) {
String cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
db.execSQL(cmd);
} public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String cmd = "UPDATE " + tableName + " SET passwd='654321' WHERE name='AMY')";
db.execSQL(cmd);
} public String showTable(){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(tableName, null, null, null, null, null, null);
String str = "";
if(cursor.getCount()!=0){ // 查询符合条件的记录个数
cursor.moveToFirst(); // 移动到第一个记录
for(int i=0; i<cursor.getCount();i++){
str += cursor.getString(0)+" "+cursor.getString(1)+"\n";
cursor.moveToNext(); // 移动到下一个记录
}
}
return str;
} }

然后,我们便可以在MainActivity内使用我们定义的SQLiteOpenHelper类的方法。

	btnShow = (Button) findViewById(R.id.btnShow);
btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper = new MyDBHelper(MainActivity.this, dbName, null, 1);
new AlertDialog.Builder(MainActivity.this).setTitle("MyDBHelper")
.setMessage(dbHelper.showTable()).setNegativeButton("OK", null).show();
}
});

完整代码如下:

MainActivity.java

import android.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends AppCompatActivity { private Button btnShow;
private String dbName = "myDB";
private MyDBHelper dbHelper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); btnShow = (Button) findViewById(R.id.btnShow);
btnShow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dbHelper = new MyDBHelper(MainActivity.this, dbName, null, 1);
new AlertDialog.Builder(MainActivity.this).setTitle("MyDBHelper")
.setMessage(dbHelper.showTable()).setNegativeButton("OK", null).show();
}
});
} }

MyDBHelper.java

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; public class MyDBHelper extends SQLiteOpenHelper {
private String tableName = "User"; public MyDBHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
} public void onCreate(SQLiteDatabase db) {
String cmd = "CREATE TABLE IF NOT EXISTS " + tableName + " (name VARCHAR, passwd VARCHAR)";
db.execSQL(cmd);
} public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
String cmd = "UPDATE " + tableName + " SET passwd='654321' WHERE name='AMY')";
db.execSQL(cmd);
} public String showTable(){
SQLiteDatabase db = this.getReadableDatabase();
Cursor cursor = db.query(tableName, null, null, null, null, null, null);
String str = "";
if(cursor.getCount()!=0){ // 查询符合条件的记录个数
cursor.moveToFirst(); // 移动到第一个记录
for(int i=0; i<cursor.getCount();i++){
str += cursor.getString(0)+" "+cursor.getString(1)+"\n";
cursor.moveToNext(); // 移动到下一个记录
}
}
return str;
} }

Android开发手记(18) 数据存储三 SQLite存储数据的更多相关文章

  1. Android开发工程师文集-1 小时学会SQLite

    前言 大家好,给大家带来Android开发工程师文集-1 小时学会SQLite的概述,希望你们喜欢 内容 什么是Sqlite: 效率高,开源,小型,程序驱动,支持事务操作,无数据类型,可嵌入的关系型数 ...

  2. Android开发手记&lpar;19&rpar; 数据存储四 ContentProvider

    转载自:http://www.cnblogs.com/devinzhang/archive/2012/01/20/2327863.html Android为数据存储提供了五种方式: 1.SharedP ...

  3. Android开发手记&lpar;16&rpar; 数据存储一 SharedPreferences

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SharedPreferenc ...

  4. Android开发14——监听内容提供者ContentProvider的数据变化

    一.提出需求 有A,B,C三个应用,B中的数据需要被共享,所以B中定义了内容提供者ContentProvider:A应用修改了B应用的数据,插入了一条数据.有这样一个需求,此时C应用需要得到数据被修改 ...

  5. Android开发手记&lpar;22&rpar; 传感器的使用

    Android的传感器主要包括八大传感器,他们分别是:加速度传感器(accelerometer).陀螺仪(gyroscope).方向传感器(orientation).磁力传感器(magnetic fi ...

  6. Android 开发手记一NDK编程实例

    在Android上,应用程序的开发,大部分基于Java语言来实现.要使用c或是c++的程序或库,就需要使用NDK来实现.NDK是Native Development Kit的简称.它是一个工具集,集成 ...

  7. Android 开发 VectorDrawable 矢量图 (三)矢量图动画

    VectorDrawable 矢量图 三部曲: Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图 Android 开发 VectorDrawabl ...

  8. Android开发之从网络URL上下载JSON数据

    网络下载拉取数据中,json数据是一种格式化的xml数据,非常轻量方便,效率高,体验好等优点,下面就android中如何从给定的url下载json数据给予解析: 主要使用http请求方法,并用到Htt ...

  9. Android开发ListView使用OnScrollListener实现分页加载数据

    上篇博文和大家分享了下拉刷新,这是一个用户体验很好的操作方式.新浪微薄就是使用这样的方式的典型. 还有个问题,当用户从网络上读取微薄的时候.假设一下子所有载入用户未读的微薄这将耗费比較长的时间,造成不 ...

随机推荐

  1. 获取WIFI密码

    在十年前,我还在上初中,班上只有极少数的富二代用得起手机:几年后诺基亚.摩托罗拉.三星手机开始盛行:近些年,安卓.苹果系统手机占据了基本整个市场,WIFI出变得越来越重要. Wifi万能钥匙数据库存储 ...

  2. Could not find a transformer to transform &quot&semi;SimpleDataType&lbrace;type&equals;org&period;mule&period;transport&period;NullPayload

    mule esb报错 com.isoftstone.esb.transformer.Json2RequestBusinessObject.transformMessage(Json2RequestBu ...

  3. 在桌面Linux环境下开发图形界面程序的方案对比

    在Linux下开发GUI程序的方法有很多,比如Gnome桌面使用GTK+作为默认的图形界面库,KDE桌面使用Qt作为默认的图形界面库,wxWidgets则是另一个使用广泛的图形库,此外使用Java中的 ...

  4. 设置Oracle用IP远程连接和客户端访问

    要想将oracle设置为多用户可远程访问,须进行以下设置: 1.路径:D:\app\Administrator\product\11.1.0\db_1\NETWORK\ADMIN\listener.o ...

  5. HPUX在oracle10g安装和卸载缩写

    创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处.否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/ ...

  6. iOS Run loop使用实例

    http://blog.csdn.net/libaineu2004/article/details/45364737 一.Runloop简介: Run loops 是线程相关的的基础框架的一部分.一个 ...

  7. loadrunner录制时web时,安全证书问题

    测试环境:win7+LoadRunner11+ie9 遇到的问题:用LoadRunner录制时,打开百度,总是报安全证书问题,如图所示 解决方法:Tools——Recording Options——p ...

  8. &period;NET平台下,初步认识AutoMapper

    初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象   前言 通常 ...

  9. Django--cookie 和 session

    一 . 会话跟踪 简单来说就是如果谢霆锋登录了淘宝,然后他点击淘宝内的任何连接就不需要在登录了,这是由于这个会话中数据共享, 也就是会话跟踪, 我们都知道http协议是短连接 无状态的,也就是说你登录 ...

  10. 机器学习实战笔记-k-近邻算法

    机器学习实战笔记-k-近邻算法 目录 1. k-近邻算法概述 2. 示例:使用k-近邻算法改进约会网站的配对效果 3. 示例:手写识别系统 4. 小结 本章介绍了<机器学习实战>这本书中的 ...