Android中的5种数据存储方式之——SQLite
来源:互联网 发布:js treeview drag区域 编辑:程序博客网 时间:2024/06/13 08:28
知识不用就会生疏,因为最近在做毕业设计的东西,需要用到数据库,今天复习一下数据库的一些东西。 从易到难巩固一下。
关于SQLite几个牛逼博客
郭霖:http://blog.csdn.net/sinyu890807/article/category/2522725
郭大侠部分内容详细解析:
http://www.tuicool.com/articles/aaAnMnA
凯风:http://blog.csdn.net/flowingflying/article/details/6846991
关于SQLite几个牛逼框架
http://www.codeceo.com/article/5-android-orm-framework.html
哈哈,个人感觉xUtils用的也还顺手,或者说用郭大侠的LitePal。
传统sqlite工具类:
http://forhope.iteye.com/blog/1461412
SQLite特点主要包括:
1、 轻量级 一个动态库、单文件
2、 独立性 没有依赖、无须安装
3、 隔离性 全部在一个文件夹中
4、 跨平台 支持众多操作系统
5、 多语言接口 支持众多编程语言
6、 安全性 事务
关于事务处理的安全性:
通过数据库上的独占性和共享锁来实现独立事务处理 多个进程可以同一时间从同一个数据库读取数据,但只有一个可以写入数据。
SQLite的数据类型:
SQLite支持NULL、INTEGER、REAL、TEXT、BLOB数据类型
-依次代表:空值、整型值,浮点值,字符串值,二进制对象
动态数据类型(弱引用):
当某个值插入到数据库时,SQLite会检查他的数据类型,如果该类型与关联的列类型不匹配,SQLite就会尝试将该值转换成该列的类型,如果不能转换,该值将作为本身的类型存储。
使用须知:
-由于资源占用少、性能良好和零管理成本,嵌入式数据库有了他的用武之地。例如Android、IOS
-没有可用于SQLite的网络服务器、只能通过网络共享可能存在文件锁定或者性能问题。
-只提供数据库级的锁定。
-没有用户账户概念,而是根据文件系统确定所有数据库的权限
OK,下面还是通过实例来复习吧!
实例A 、
一,新建一个项目
二,每个程序都有自己的数据库 默认情况下是各自互相不干扰
三,创建一个数据库 并且打开
1 -使用openOrCreateDatabase建一个数据库(会创建一个文件夹)
2 -三个参数name:名字,后续用.db可以用第三方工具打开
3- mode :权限
4- factory:无介绍
四,用SQL创建一张表
db.execSQL("create table if not exists usertb (_id integer primary key autoincrement,name text not null,age integer not null, sex text not null)");
创建数据:
db.execSQL("insert into usertb(name,sex,age) values('剑姬','女',18)");// 插入数据
五,使用db.rawQuery(sql,selectionArgs)
sql:sql的语句
selectionArgs:查询条件 ,null查询全部数据
六,Cursor:
查询结果赋值给Cursor
Cursor c = db.rawQuery(“select * from usertb”,null);
创建if语句 里面嵌套while循环 21:00
while循环外 用c.close();作为游标释放
if循环外 用db.close(); 作为数据库释放
关于游标的内容可以查看一下这里的内容这里写链接内容
附上代码:MainActivity.java
public class MainActivity extends Activity { private TextView tView; private SQLiteDatabase db; List<String> list; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listView = (ListView) findViewById(R.id.listView); // 每个程序都有自己的数据库 默认情况下是各自互相不干扰 // 创建一个数据库 并且打开 db = openOrCreateDatabase("lol.db", MODE_PRIVATE, null);// (数据库名称,权限,数据工厂) db.execSQL("create table if not exists loldb (_id integer primary key autoincrement, name text not null , age integer not null , sex text not null )");// 执行任何SQL语句 db.execSQL("insert into loldb(name,sex,age) values('剑姬','女',18)");// 插入数据 db.execSQL("insert into loldb(name,sex,age) values('剑圣','男',19)");// 插入数据 db.execSQL("insert into loldb(name,sex,age) values('剑魔','男',20)");// 插入数据 db.execSQL("insert into loldb(name,sex,age) values('剑豪','男',20)");// 插入数据 list = new ArrayList<String>(); Cursor c = db.rawQuery("select * from loldb", null);// 可以理解为一个集合 if (c != null) { while (c.moveToNext()) { Log.i("info", "_id:" + c.getInt(c.getColumnIndex("_id"))); Log.i("info", "name:" + c.getString(c.getColumnIndex("name"))); Log.i("info", "age:" + c.getInt(c.getColumnIndex("age"))); Log.i("info", "sex:" + c.getString(c.getColumnIndex("sex"))); Log.i("info", "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"); } } c.close();// 关闭游标 db.close();// 关闭数据库 }}
那么将见好的内容导出来的话可以看见里面建好了一个数据库文件
在使用数据库可视化工具查看可以看见里面的内容
实例B 、
这样的方法呢,比第一种好那么点点吧。
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SQLiteDatabase db = openOrCreateDatabase("mylol.db", MODE_PRIVATE, null); db.execSQL("create table if not exists loldb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)"); ContentValues values = new ContentValues(); // ContentValues 和HashTable类似都是一种存储的机制 // 但是两者最大的区别就在于,contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象。 values.put("name", "女警");// 存放键值对 values.put("sex", "女"); values.put("age", 19); long rowId = db.insert("loldb", null, values);// 插入值 values.clear();// 清空ContentValues对象 values.put("name", "寒冰"); values.put("sex", "女"); values.put("age", 18); db.insert("loldb", null, values); values.clear(); values.put("name", "萝莉"); values.put("sex", "女"); values.put("age", 20); db.insert("loldb", null, values); values.clear(); values.put("name", "德莱文"); values.put("sex", "男"); values.put("age", 21); db.insert("loldb", null, values); values.clear(); values.put("name", "男枪"); values.put("sex", "男"); values.put("age", 22); db.insert("loldb", null, values); values.clear(); values.put("sex", "女"); db.update("loldb", values, "_id>?", new String[] { "3" });// 将全部id>3的人的性别改成女 db.delete("loldb", "name like ?", new String[] { "%女%" });// 删除所有名字中带有女的人 Cursor c = db.query("loldb", null, "_id>?", new String[] { "0" }, null, null, "name"); if (c != null) { String[] columns = c.getColumnNames(); while (c.moveToNext()) { for (String columnName : columns) { Log.i("info", c.getString(c.getColumnIndex(columnName))); } } c.close(); } db.close(); }}
实例 C 、
这里的话说说最长用的那种吧,,,
新建一个java类 继承SQLiteOpenHelper
重写里面的两个方法
onCreate
onCreate(SQLiteDatabase db):用户初次使用软件时生成数据库,一旦数据库存在则不会调用此方法。函数是在第一次创建数据库的时候执行的,仅仅生成DataBaseHelper对象(SQLiteOpenHelper类型)的时候是不会调用该函数的,而只有当调用DataBaseHelper对象的getReadableDataBase时或者是调用了getWritableDataBase时,如果是第一次创建数据库,那么就一定会调用onCreate()函数。
onUpgrade
onUpgrade(SQLiteDatabase db,int oldVersion,int vewVersion):用于升级软件时更新数据库表结构,如增加表、列字段等操作。
提示一下,在软件升级前,最好对原有数据进行备份,在新表建好后把数据导入新表中。
下面还是来看实例吧。
public class DBOpenHelper extends SQLiteOpenHelper { public DBOpenHelper(Context context, String name) { super(context, name, null, 1); } public DBOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override // 首次创建数据库的时候调用 一般可以把建库 建表的操作 public void onCreate(SQLiteDatabase db) { db.execSQL("create table if not exists girldb(_id integer primary key autoincrement,name text not null,sex text not null,age integer not null)"); db.execSQL("insert into girldb(name,sex,age)values('baby','女',26)"); } @Override // 当数据库的版本发生变化的时候 会自动执行 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DBOpenHelper helper = new DBOpenHelper(MainActivity.this, "girl.db"); // helper.getReadableDatabase();//获取一个只读的数据库 只能查询 不能写入 不能更新 SQLiteDatabase db = helper.getWritableDatabase(); // db.query(table, columns, selection, selectionArgs, groupBy, having, // orderBy) Cursor c = db.rawQuery("select * from girldb", null); if (c != null) { String[] cols = c.getColumnNames(); while (c.moveToNext()) { for (String ColumnName : cols) { Log.i("info", ColumnName + ":" + c.getString(c.getColumnIndex(ColumnName))); } } c.close(); } db.close(); }}
实例D、
待续、、、、、、、、、、、、、、、
A 、
A 、
- Android中的5种数据存储方式之——SQLite
- Android中的5种数据存储方式之——文件存储数据
- Android中的5种数据存储方式之——SharedPreferences
- Android中的5种数据存储方式
- Android中的5种数据存储方式。
- Android中的5种数据存储方式。
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- Android中的5种数据存储方式
- 18.OC点语法和变量作用域
- ORACLE PL/SQL编程,触发器
- 验证码——python去除干扰线
- ubuntu安装flash插件
- JavaScript总结
- Android中的5种数据存储方式之——SQLite
- android wifi信号检测
- VS2015 使用RDLC报表
- 生成树计数(和MOD取模)
- DirectX11 Alpha通道
- 寻人启事网-寻人档案-推荐
- 三种工厂模式的C++实现
- STM32f103焊接系列的温度
- symfony权威指南(4、1)之动作