【数据】SQLite

SQLite特点:

  1. 轻量级 = 一个动态库、单文件
  2. 独立性 = 没有依赖、无须安装
  3. 隔离性 = 全部在一个文件夹中
  4. 跨平台 = 支持众多操作系统
  5. 多语言接口 = 支持众多编程语言
  6. 安全性 = 事务独立

事务处理的安全性:

  • 通过数据库上的独占性和共享锁来实现独立事务处理
  • 多个进程可以同一时间从同一个数据库读取数据,但只有一个可以写入数据。

SQLite数据类型:
支持NULL(空值)、INTEGER(整型值)、REAL(浮点值)、
TEXT(字符串值)、BLOB数据类型(二进制对象)

动态数据类型(弱引用)
当某个值插入到数据库时,SQLite会检查他的数据类型,如果该类型与关联的列类型不匹配,SQLite就会尝试将该值转换成该列的类型,如果不能转换,该值将作为本身的类型存储。

使用须知:
-由于资源占用少、性能良好和零管理成本,嵌入式数据库有了他的用武之地。例如Android、IOS
-没有可用于SQLite的网络服务器、只能通过网络共享可能存在文件锁定或者性能问题。
-只提供数据库级的锁定。
-没有用户账户概念,而是根据文件系统确定所有数据库的权限

SQLite是D.Richard Hipp用c语言写的开源嵌入式数据库引擎.他支持大多数SQL92标准,并且可以在所有主要操作系统上运行

  • 引擎很小但是支持高达两个TB大小的数据库
  • 以单个文件形式存在
  • 以B-Tree的数据结构形式存储在磁盘

SQLite方法

db.execSQL(sql);//执行任何SQL语句
db.insert(table,nullColumnHack,values);//插入
db.delete(table,whereClause,whereArgs);//删除
db.update(table,whereClause,whereArgs);//升级
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy);//查询
db.rawRuery(sql,selectionArgs);//省力的查询_不必自己写sql语句

详细的sql解答

//SQLiteDatabase提供了一些管理SQLite数据库的类
//提供创建,删除,执行SQLite命令,并执行数据库管理任务的方法
//每个程序的数据库名字是唯一的

db.execSQL(sql)//执行任何SQL语句(除了查询语句,因为返回类型不匹配)

//插入(表名,空列的日志,值)
db.insert(String table,String nullColumnHack,ContentValues values)

//删除(表名,删除条件,删除条件数组值)
db.delete(String table,String whereClause,String[] whereArgs);

//升级、更新(表名,值,更新条件,更新的条件数组)
db.update(String table,ContentValues values,String whereClause,String[]whereArgs);

//查询(表名,查询的列,位置条件,与selection拼成条件,分组,筛选,排序,分页限制)
db.query(String table,String[]Columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)
db.rawQuery(sql,selecionArgs)(查询)

!!!****//PS:如果String whereClause(String selection)写得比较完整,则String[] whereArgs(String selectionArgs)可置为null

sql建表流程
使用openOrCreateDatabase建一个数据库(会创建一个文件夹)
参数name:名字, 后续用.db可以用第三方工具打开
mode :权限
–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')");

使用sql:sql的语句

db.rawQuery(sql,selectionArgs)
//selectionArgs:查询条件 ,null查询全部数据

Cursor:
查询结果赋值给Cursor

Cursor c = db.rawQuery("select * from usertb",null);
//创建if语句 里面嵌套while循环 21:00
//while循环外 用c.close();作为游标释放
//if循环外 用db.close(); 作为数据库释放

SQLiteDatabase db = openOrCreateDatabase("database.db", MODE_PRIVATE,
null);// (数据库名称,权限,数据工厂)
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)");// 执行任何SQL语句
db.execSQL("insert into usertb(name,sex,age)values('张三','女',18)");//插入数据
//Cursor:游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获取列值方法getString()等常用方法:

/*
getCount()总记录条数
isFirst()判断是否第一条记录
isLast()判断是否最后一条记录
moveToFirst()移动到第一条记录
moveToLast()移动到最后一条记录
move(int offset)移动到指定记录
moveToNext()移动到下一条记录
moveToprevious()移动到上一条记录
getColumnIndexOrThrow(String columnName)据列名称获取列索引
getInt(int columnIndex)获取指定列索引的int类型值
getString(int columnIndex)获取指定列索引的String类型值
*/

Cursor c=db.rawQuery("select*from table",null);
if(c!=null){
    While(c.moveNext()){
        //遍历全部的数据、提供查询
    }

}

//Ps1:每个程序都有自己的数据库,默认情况下是互相不干扰。
//Ps2:记住关闭Cursor(while循环之外)和SQLiteDatabase(if判断之外)。

2

//使用内置函数操作数据库
//1. ContentValues类
//存储一组可以被ContentResolver处理的值,可以理解为它的对象存储了多个键值对
//2. 使用ContentValues和内置函数插入数据库
ContentValues values = new ContentValues();
values.put("name", "xzhang76");
values.put("sex", "man");
values.put("age", 26);
sqLiteDatabase.insert("studentdb", null, values);
    //可以将values清空,并重新存值。
values.clear();
values.put("name", "xzhang65");
values.put("sex", "man");
values.put("age", 27);
sqLiteDatabase.insert("studentdb", null, values);
//3. 更新和删除
sqLiteDatabase.update("studentdb", values, "_id>?", new String[]{"4"});
sqLiteDatabase.delete("studentdb", "name like ?", new String[]{"%8%"});
//4. 通过Cursor类的getColumnNames()可以得到所有的列名
String[] columnNames = cursor.getColumnNames();
while (cursor.moveToNext()) { //moveToNext()可以移动到下一行
    for(String columnName:columnNames) {
        Log.i(TAG, cursor.getString(cursor.getColumnIndex(columnName)));
    }
}
SQLiteDatabase db = openOrCreateDatabase("data.db", MODE_PRIVATE, null);//打开
db.execSQL("create table if not exists usertb(_id integer primary key autoincrement
,name text not null,age integer not null)");
ContentValues values = new ContentValues();// 初始化
values.put("name", "张山");// 添加值
values.put("age", 50);
db.insert("usertb", null, values);// 执行插入SQL语句
values.clear();// 清除values中添加的值
values.put("name", "李事");
values.put("age", 40);
db.insert("usertb", null, values);

db.delete("usertb", "age>?", new String[] { "40" });// 删除
Cursor c = db.query("usertb", null, "_id>?", new String[] { "0" },
null, null, "age");// 查询
if (c != null) {
    String[] columnName = c.getColumnNames();// 获取所有的列名
    while (c.moveToNext()) {
        for (String name : columnName) {
            Log.i("tag", c.getString(c.getColumnIndex(name)));
        }
    }
    c.close();//游标关闭
}
db.close();
//SQLiteDatabase创建数据库,并且实现增删改查。
//创建数据库对象
SQLiteDatabase db = openOrCreateDatabase("data.db", MODE_PRIVATE, null);
//创建数据库
db.execSQL("create table if not exists studb(_id integer primary key autoincrement
,name text not null,age integer not null)")
//values对象添加数据 put方法。values.clear释放内存
ContentValues values = new ContentValues();

//更改操作
values.put("name","若曦");
db.update("stutb",values,"name likes ?",new String[]{"四爷"});

//查询db.query()获取游标对象
Cursor c = db.query("stutb",null,"id>?",new String[]{"0"},null,null,null);

//获得所有字段
String []columns = c.getColumnNames();

//通过日志方式打印表
while(c.moveToNext()){
for (String columnName: columns) {
Log.i("info", "" + c.getString(c.getColumnIndex(columnName)));

9/1

SQLiteOpenHelper : SQLiteOpenHelper帮助类,用于对数据库进行创建和升级。
实现两个方法:onCreate()方法用来实现创建数据库、onUpgrade()用来实现升级数据库

getWritableDatabase() 和 getReadableDatabase() 方法
都可以获取一个用于操作数据库的SQLiteDatabase实例。其中getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,使用的是getWritableDatabase() 方法就会出错。

//创建文件:
public class MainActivity extends Activity{
    protected void onCreat(Bundle savedInstanceState){
        super.onCreat(savedInstanceState);
        setContentView(R.layout.activity_main);
        File file=new File("/mnt/sdcard/test"); //创建文件
        if(!file.exists()){ //判断文件是否存在
            try{
                file.createNewFile(); //文件不存在就创建它
            }catch(IOException e){
                e.printStackTrace();
            }
        }else{
            Toast.makeText(MainActivity.this,"文件已存在",1000;
        }
        //file.delete(); //删除文件
    }
}
Android中文件存储的操作
1.Activity的openFileOutput()方法可以把数据输出到文件中
2.创建的文件保存在/data/data/<package name>/files目录
3.实现过程与在java中保存数据到文件中是一样的

<!-- 在SD卡中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>

<!-- 向SD卡写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
MODE_PRIVATE
-为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖该原文件的内容。
MODE_APPEND
-模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE
-用来控制其他应用是否有权限读写该文件
MODE_WORLD_READABLE
-表示当前文件可以被其他应用读取
MODE_WORLD_WRITEABLE
-表示当前文件可以被其他用用写入
this.getExternalFilesDir(type); //得到外部数据存储目录
File file=this.getExternalCacheDir(); //得到缓存文件的存放位置
File file1 = this.getFilesDir();// 得到的是当前应用程序默认的数据存储目录
File file2 = this.getCacheDir();// 得到的是当前应用程序默认的缓存文件目录
/**
* 一些不是非常重要的数据可以存放在此目录file2 如果手机内存不足,系统会自动删除app中cache目录数据
*/
File file3 = this.getDir("imooc", MODE_PRIVATE);// data/data/<包名>/app_imooc
Log.i("info", file3.toString());
/**
* MODE_PRIVATE为默认的操作模式,代表该文件是私有数据,只能被应用本身访问,写入的内容会覆盖原来的内容
* MODE_APPEND检查文件是否存在,存在的话就在后面追加,不存在就重新创建 MODE_WORLD_READABLE只读
* MODE_WORLD_WRITEABLE可读可写
* */
File file4 = this.getExternalCacheDir();// 外部的存储目录mnt/sdcard/Android/data/<包名>/cache<br>
/**
* file4可以得到外部的存储路径
* 如果app卸载了,这里的数据也会自动清除掉
* */
1.目录结构。this.getFilesDir().当前程序默认的数据存储目录
2.this.getCacheDir(),默认的缓存文件的存放位置,不太重要的创建使用,内存不足的时候,系统会自动删除app中cache目录的数据
3.this.getDir("imooc",MODE_PRIVATE);/data/data/<包名>/app_imooc,
4.this.getExternalCacheDir(),外部的存储位置,app卸载后会自住删除。
5.如果开发者不遵守不把数据放入data/data/<包名>或者/mnt/sdcard/Android/data/<包名>,卸载不会清除
onCreate{
    btn.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            writeFile(et.getText().toString());
            tv.setText(readFile());
        }
    });
}

//写入文件内容
public void writeFile(String content){
    try {
        FileOutputStream fos = openFileOutput("temp.txt", MODE_PRIVATE);
        //若文件不存在,自动创建
        fos.write(content.getBytes());
        fos.close();
    } catch (FileNotFoundException e) {
        ...
    }
}

//读取文件内容
public String readFile(){
    String content="";
    try {
        FileInputStream fis=openFileInput("temp.txt");
        ByteArrayOutputStream baos=new ByteArrayOutputStream();
        //可以捕获内存缓冲区的数据,转换成字节数组
        byte[] buffer=new byte[1024];
        int len=0;
        while((len=fis.read(buffer))!=-1){
            baos.write(buffer,0,len);
        }
    content=baos.toString();
    fis.close();
    baos.close();
    } catch (FileNotFoundException e) {
        ...
    }
    return content;
}

//Ps:多个MODE表示:如:MODE_WORLD_READABLE+MODE_WORLD_WRITEABLE。
当应用程序在安装时系统就会分配给它一个userid,当该应用取访问其他资源比如文件的时候,就需要userid匹配.默认情况下,任何应用创建的文件,sharedpreferences,数据库都应该是私有的(位于/data/data/<包名>/files),其他程序无法访问.除非在创建时指定了MODE_WORLD_WRITEABLE或者MODE_WORLD_READABLE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值