数据储存---SQLtie
来源:互联网 发布:java贪吃蛇游戏设计 编辑:程序博客网 时间:2024/06/05 16:58
SQLite主要特点:
- 轻量级:一个动态库,单文件
- 独立性:没有依赖,无需安装
- 隔离性:全部在一个文件夹中
- 跨平台:支持众多操作系统
- 多语言接口,支持众多编程语言
关于事务处理的安全性问题:
- 通过数据库上的独占性和共享锁来实现独立业务处理
- 多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。
关于SQLite的数据类型:
据SQLtie支持NULL(空值)、INTEGER(整型值)、REAL(浮点值)、TEXT(字符串值)和BLOB(二进制对象)数据类型。
动态数据类型(弱引用):
当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型储存。
SQLiteDatabase:
- 提供了一些管理SQLite数据库的类
- 提供创建,删除,执行SQL命令,并执行其他常见的数据库管理任务的方法
- 每个程序的数据库名字是唯一的
SQLiteDatabase的一些常用方法:
- void/execSQL(String sql) <Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data.>{
SQLException if the SQL string is invalid} - void/insert(Sring table,String nullColumnHack,ContentValues values) <method for inserting a row into the database>
- int/delete(String table,String whereClause,String[]whereArgs) <method for deleting rows in the database.>
- int/update(String table,ContentValuese values,String whereClause,String[] whereArgs) <method for updating rows in the database.>
- Cursor/rawQuery(String sql,String[] selctionArgs) <Runs the provided SQL and returns a Cursor over the result set.>
- Cursor/query(String table,String[]columns,String selection,String[]selectionArgs,String groupBy,String having,String oderBy)<Query the given table ,returning a Cursor over the result set.>
<编写SQLite语句操作数据库>:
创建数据库并打开:static SQLiteDatabase/openOrCreateDatabase(name,mode,factory)
SQLiteDatabase database = openOrCreateDatabase("ice.database",MODE_PRIVATE,null);
在数据库中建立一张名为userInfo的表:
database.execSQL("creat table if not exists userInfo(_id integer primary key autoincreament ,name text not null,age integer not null , sex text not null,salary integer not null)" );
这里userInfo设置为一个主键,四个字段。_id主键自增其中主键前加”_“下划线是为了方便显示到ListView时用适配器SimpCursorAdapter查询(SimpelCursorAdapter只识别主键为下划线的字段名)
添加内容:
db.execSQL("insert into userInfo(name,age,sex,salary)values('Tom',24,'male',6500)");
TIPS:
Cursor是Android查询数据后的到的一个管理数据集合的类,Cursor的数据量较大时通常手动将Cursor 关闭掉。
- Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等,常用方法:
- getCount() 总记录条数
- isFirst() 判断是否第一条记录
- isLast() 判断是否最后一条记录
- moveToFirst() 移动到第一条记录
- moveToLast() 移动到最后一条记录
- move(int offset) 移动到指定记录
- moveToNext() 移动到下一条记录
- moveToPrevious() 移动到上一条记录
- getColumnIndexOrThrow(String columnName) 据列名称获得列索引
- getInt(int columnIndex) 获得指定列索引的int类型值
- getString(int columnIndex) 获得指定列索引的String类型值
查询内容:
db.rawQuery("select *from userInfo",null);
Cursor c = db.rawQuery("select *from userInfo",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","salary"+c.getInt(c.getColumnIndex("salary"))); Log.i("info","*******************"); } c.close(); } db.close();}
demo1:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //每个程序都有自己的数据库,默认情况下互不干扰 //创建一个数据库并打开 SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null); db.execSQL("create table if not exists userInfo(_id integer primary key autoincrement ,name text not null,age integer not null,sex text not null,salary integer not null )" ); db.execSQL("insert into userInfo(name,age,sex,salary)values('Tom',24,'male',6500)"); db.execSQL("insert into userInfo(name,age,sex,salary)values('Alice',24,'female',8000)"); db.execSQL("insert into userInfo(name,age,sex,salary)values('Tyson',24,'male',12000)"); Cursor c = db.rawQuery("select *from userInfo",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","salary"+c.getInt(c.getColumnIndex("salary"))); Log.i("info","*******************"); } c.close(); } db.close(); }}
<使用内置函数操作数据库>:
ContentValues:
此类是用来存储一组可以被ContentResolver处理的值。
- ContentValues values = new ContentValues();
- values.put("name","Tom");
- 执行对应的Sql操作
前面操作同使用SQLtie语句操作数据库。
添加内容:
ContentValues values = new ContentValues();values.put("name","Tom");values.put("age",18);values.put("sex","male");db.insert("nameInfo",null,values);values.clear();
values.put("name","Alice");values.put("age",24);values.put("sex","female");db.insert("nameInfo",null,values);
更改内容:
values.put("sex","female");db.update("nameInfo",values,"_id>?",new String[]{"4"});//将id>4的性别改为女
删除内容:
db.delete("nameInfo","name like ?",new String[]{"%m%"});//删除所有名字中带有"m"的人
查询内容:
Cursor c = db.query("nameInfo",null,"_id>0",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();}
demo2:
package com.example.administrator.sqlitedemo;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); SQLiteDatabase db = openOrCreateDatabase("userInfo",MODE_PRIVATE,null); db.execSQL("create table if not exists userInfo(_id integer primary key autoincrement,name text not null,age integer not null,s ContentValues values = new ContentValues(); values.put("name","Tom"); values.put("age",18); values.put("sex","male"); db.insert("nameInfo",null,values); values.clear(); values.put("name","Alice"); values.put("age",24); values.put("sex","female"); db.insert("nameInfo",null,values); values.clear(); values.put("name","Tyson"); values.put("age",38); values.put("sex","male"); db.insert("nameInfo",null,values); values.clear(); values.put("name","Tim"); values.put("age",16); values.put("sex","female"); db.insert("nameInfo",null,values); values.clear(); values.put("name","Holdor"); values.put("age",28); values.put("sex","male"); db.insert("nameInfo",null,values); values.put("sex","female"); db.update("nameInfo",values,"_id>?",new String[]{"4"});//将id>4的性别改为女 db.delete("nameInfo","name like ?",new String[]{"%m%"});//删除所有名字中带有"m"的人 Cursor c = db.query("nameInfo",null,"_id>0",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(); }}
SQLiteOpenHelper:
SQLiteOpenHelper是SQLiteDatabase的帮助类,用于管理数据库的创建和版本更新,一般建立一个类继承它并重写onCreate()将eonUpgrade()方法。
方法说明:
onCreate(SQLiteDatabase db) 创建数据库时调用
onUpgrade(SQLiteDatabase db, int oldVersion,int new version) 版本更新时调用
getReadableDatabase() 创建或打开一个只读数据库
gerWritableDatabase() 创建或打开一个读写数据库
新建一个DBOpenHelper类,继承SQLtieOpenHelper,并重写onCreat(),onUpgrade.并给出构造函数:
public class DBOpenHelper extends SQLiteOpenHelper{ public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); } @Override public void onCreate(SQLiteDatabase db) { //首次创建数据库时调用,建库、建表的操作可以在此执行 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //当数据库的版本发生变化时会自动执行 }}
demo3:
DBOpenHelper.java
public class DBOpenHelper extends SQLiteOpenHelper{ public DBOpenHelper(Context context, String name) { super(context, name, null, 1); } public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); } @Override public void onCreate(SQLiteDatabase db) { //首次创建数据库时调用,建库、建表的操作可以在此执行 db.execSQL("create table if not exists icecold(_id integer primary key autoincrement,name text not null,age integer not null , sex text not null )"); db.execSQL("insert into icecold(name,age,sex) values ('Axe','34','male')"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //当数据库的版本发生变化时会自动执行 }}
MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); DBOpenHelper helper = new DBOpenHelper(MainActivity.this,"icecold.db"); //helper.getReadableDatabase();//只能查询不能写入也不能更新 SQLiteDatabase db = helper.getWritableDatabase(); //db.query() Cursor c = db.rawQuery("select * from icecold",null); if (c!=null){ String[] cols = c.getColumnNames(); while (c.moveToNext()){ for(String ColunmName: cols){ Log.i("info",ColunmName+":"+c.getString(c.getColumnIndex(ColunmName))); } } c.close(); } db.close(); }}
0 0
- 数据储存---SQLtie
- 储存数据
- 数据储存
- 数据储存
- 数据储存
- 数据储存的发展
- erlang 数据储存
- 使用SQLite储存数据
- OC 数据储存
- Android数据储存
- IOS数据储存
- sharepreference储存数据
- OC数据储存
- android数据储存
- ios数据储存
- Sharedperferences数据储存
- 数据储存结构
- Android中的数据储存
- 问题 J: 网络寻路
- [Codeforces 689D] Friends and Subsequences (二分+稀疏表)
- 问题 I 操作格子
- 什么是用户体验
- Android应用程序(APK)的编译打包过程
- 数据储存---SQLtie
- 问题 H 查找整数
- VC CTime
- 面向切面编程(AOP)的理解
- POJ3286 How many 0's?
- jsp原理
- 进程线程 委托发起进程 回调
- Python中双冒号的作用[::]
- Python实现属于自己的公交地铁线路图