【数据库学习】数据库安全、SQL Server、SQList、android之sqlite
来源:互联网 发布:八门神器修改数据闪退 编辑:程序博客网 时间:2024/06/06 01:18
1,安全性
1)SQL注入
SQL执行时,2种方式:
①字符串处理(拼接),然后执行SQL
用户输入的时候,可以通过输入sql语句来进行SQL注入。
②传参,执行SQL –>交给SQL引擎(推荐)
2,SQL Server
1)多重排序查询:
先按字段5排序,再按字段6排序
默认为asc:升序排列。desc:降序排序。
order by 字段5,字段6 asc
2)联表查询
select a.title,b.type_name from news_table as a,name_table as b where a.type_id=b.type_id ; select 字段1,字段2,字段3,字段4 from 表
3)等于:=
不等于:<>
4)存储过程
sql尽量放在存储过程中。
面对大量数据,用orcle比sql server稳定。
3,mysql命令行:
##1)查看数据库:
show databases;
2)建库:
create database children;
3)调用数据库
use children;
4)建表
主键、非空。
create table product(no char(10) primary key,code char(10) not null unique,online char(1),bind char(1));
外键:
foreign key(no) references product(no)
5)更新
update near_log set lnt=99 where no=001;
6)插入
insert into product values('001','001','N','N');
7)删除
delete from all_log where lnt=34.342342;delete from all_log;
drop table user;
4,android之sqlite
##1)概念
sqlite是一款轻量级数据库,是遵守ACID(指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability))的关系型数据库管理系统。在嵌入式设备中,可能只需要几百K的内存就够了。
2)安全性
android手机root之后,就可以在/data/data/包名/database/目录中查看sqlite数据库。所以,对于敏感信息,应该考虑加密。
SQLite不支持加密,所以我们针对数据库文件加密。现有两种解决方案:
i>对数据库中的数据进行加密
①优点:
加密速度快。
程序无须变动,只针对数据进行加密。
②缺点:
来回加密,造成处理数据缓慢。
仅对数据加密,依然可以看到数据表的sql语句,可能猜测到表的作用。
③实现:
一是:对明文数据进行加密返回密文数据
二是:对密文数据进行解密返回明文数据
ii>对数据库文件进行加密
①优点
对整个文件进行了加密,用户通过编辑器看不到任何有用的数据。
进行数据库打开时,使用程序即可解密文件。
②缺点
需要修改sqlite源码,这个工作难度比较大。
③实现(太难,本人并没有进行实验)
a.修改sqlite源代码,追加对数据库文件进行加密的功能。
b.编译含有加密功能的程序源代码,生成各自平台需要使用的库文件。
c.将加密sqlite库文件引入各自平台中,修改数据库访问层代码。
d.进行程序的部署,测试。
3)demo
i>在AndroidManifest.xml中添加权限:
<!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
ii>添加继承SQLiteOpenHelper的MyHeper类,用于创建使用数据库。
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.util.Log;public class MyHelper extends SQLiteOpenHelper { private String Tag = "MyHelper"; private static String DB_NAME = "luoDB.db"; //数据库名称 public static String TABLE_NAME_TASK = "Task"; //联班任务_fra_task表名 /**super(参数1,参数2,参数3,参数4),其中参数4是代表数据库的版本, * 是一个大于等于1的整数,如果要修改(添加字段)表中的字段,则设置 * 一个比当前的 参数4大的整数 ,把更新的语句写在onUpgrade(),下一次 * 调用 */ public MyHelper(Context context) { super(context, DB_NAME, null, 1); } @Override public void onCreate(SQLiteDatabase db) { //Create table try{ String sql = "CREATE TABLE "+TABLE_NAME_TASK + "(" + "TaskCode TEXT PRIMARY KEY," + "TaskState TEXT," + "TaskName TEXT" + ");"; db.execSQL(sql); //创建表 }catch(Exception e){ LogUtil.i(Tag, "onCreate" + e.getMessage()); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}
iii>创建DatabaseUtil进行数据库操作。
import java.util.ArrayList;import java.util.List;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;import android.text.style.TtsSpan.DateBuilder;/** * task数据操作。 ①存入数据库:每次getList的时候调用。每次删除所有数据,插入所有内容到数据库。 * ②删除内容:每次存入数据库的时候调用。删除所有数据。private。 ③更新:没有此功能。 ④取数据:两种情况下调用: * -----i>切换任务、保障等Tab且未收到服务器让重新getList的命令。(所以只有第一次登录才需要第一次进入taskFragment时获取数据) * -----ii>切换已降落(有实落)、未降落Tab. 另外,取到的数据为列表返回。 * * @author luo * */public class DatabaseUtil { private String Tag = "DatabaseUtil"; private MyHelper helper; public DatabaseUtil(Context context) { super(); try { context.deleteDatabase("luoDB.db"); helper = new MyHelper(context); } catch (Exception e) { LogUtil.e(Tag, "DatabaseUtil" + e.getMessage()); } } /** * 插入数据 插入数据之前,删除所有数据 * * @param taskList * @return */ public boolean Insert(List<Task> taskList) { SQLiteDatabase db = helper.getWritableDatabase(); try { DeleteALL(db); for (Task task : taskList) { String sql = "insert or replace into " + MyHelper.TABLE_NAME_TASK + "(TaskCode,FlightNumStr,TaskName,TaskState," + "ThisPlanLanding,ThisActualLanding,ThisPlanOff,ThisActualOff," + "Gate,AircraftNumber,BoardingGate,AircraftType,IsDelay) values (" + "'" + task.TaskCode + "' ," + "'" + task.TaskName + "' ," + "'" + task.TaskState + "'" + ")"; db.execSQL(sql); } return true; } catch (SQLException e) { LogUtil.i(Tag, "Insert" + e.getMessage()); return false; } finally { db.close(); } } /** * 删除所有数据 */ private void DeleteALL(SQLiteDatabase db) { try { db.execSQL("delete from " + MyHelper.TABLE_NAME_TASK); } catch (Exception e) { LogUtil.i(Tag, "Delete" + e.getMessage()); } } /** * 查询所有数据 */ public List<Task> queryAll() { List<Task> list = new ArrayList<Task>(); try { SQLiteDatabase db = helper.getReadableDatabase(); Cursor cursor = db.query(MyHelper.TABLE_NAME_TASK, null, null, null, null, null, null); while (cursor.moveToNext()) { Task task = new Task(); task.TaskCode = cursor.getString(cursor.getColumnIndex("TaskCode")); task.TaskName = cursor.getString(cursor.getColumnIndex("TaskName")); task.TaskState = cursor.getString(cursor.getColumnIndex("TaskState")); list.add(task); } db.close(); } catch (Exception e) { LogUtil.i(Tag, "queryAll" + e.getMessage()); } return list; } public List<Task> queryByThisActualLanding(Boolean actual) { SQLiteDatabase db = helper.getReadableDatabase(); List<Task> list = new ArrayList<Task>(); Cursor cursor = null; /** * public Cursor query (String table, String[] columns, String * selection, String[] selectionArgs,String groupBy, String * having,String orderBy,String limit)参数如下: * table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。 * columns:要查询出来的列名。相当于select语句select关键字后面的部分。 * selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?” * selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。 * |------在 selection 中需要嵌入字符串的地方用 ? 代替,然后在 selectionArgs * 中依次提供各个用于替换的值就可以了. groupBy:相当于select语句group by关键字后面的部分 * having:相当于select语句having关键字后面的部分 orderBy:相当于select语句order * by关键字后面的部分,如:personid desc, age asc升序; * limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。 */ cursor = db.query(MyHelper.TABLE_NAME_TASK, new String[] { "TaskCode", "TaskName", "TaskState" }, "TaskCode<>'' ", null, null, null, "TaskCode asc"); // Cursor cursor = db.query(table, columns, selection, selectionArgs, // groupBy, having, orderBy) while (cursor.moveToNext()) { Task task = new Task(); task.TaskCode = cursor.getString(cursor.getColumnIndex("TaskCode")); task.TaskName = cursor.getString(cursor.getColumnIndex("TaskName")); task.TaskState = cursor.getString(cursor.getColumnIndex("TaskState")); list.add(task); } db.close(); return list; }}
4)其它
###①多条件查询:
and连接。
###②模糊查询:
i>使用这种query方法%号前不能加’
cursor = db.query(MyHelper.TABLE_NAME_TASK, new String[] { "TaskCode","TaskName"}, "TaskName like ?", new String[]{"%" + TaskName + "%"}, null, null, null);
ii>使用这种query方法%号前必须加’
Cursor c_test = mDatabase.query(tab_name, new String[]{tab_field02}, tab_field02+" like '%" + str[0] + "%'", null, null, null, null);
iii>使用这种方式必须在%号前加’
String current_sql_sel = "SELECT * FROM "+tab_name +" where "+tab_field02 +" like '%"+str[0]+"%'"; Cursor c_test = mDatabase.rawQuery(current_sql_sel, null);
多重排序,字符串排序
cursor = db.query(MyHelper.TABLE_NAME_TASK, new String[] { "TaskCode", "TaskName","TaskState"}, "TaskName like ?", new String[]{"%" + TaskName+ "%"}, null, null, "(case" + " when TaskState like '" + TaskState.STATE2 + "' then 2" + " when TaskState like '" + TaskState.STATE1 + "' then 1" + " else 3" + " end)" + ",TaskCode asc");
- 【数据库学习】数据库安全、SQL Server、SQList、android之sqlite
- Android SQList 数据库
- SQList数据库
- SQList数据库
- android之sqlite数据库学习
- android学习之sqlite数据库
- android学习之sqlite数据库
- Android学习之数据库SQLite
- SQL Server 数据库安全
- SQL Server 数据库安全
- SQL Server 数据库安全
- SQL Server 数据库安全
- SQL Server 数据库安全
- SQL Server 数据库安全
- SQL Server 数据库安全
- SQL Server 数据库安全
- SQL Server 数据库安全
- SQL Server 数据库安全
- 香农编码、费诺编码、哈弗曼编码
- Conda:误解与迷思
- CentOS7下yum源搭建编程环境
- 用c++画椭圆
- sizeof
- 【数据库学习】数据库安全、SQL Server、SQList、android之sqlite
- J2ME是闯进电信丛林的兔子?
- Linux命令(1)
- 数据结构-二叉树(Binary Tree)
- 2017年全栈工程师图谱-熊盼
- 纵向编辑vim
- ZCMU—1770
- debian 8 (systemd) 上 Shadowsocks-libev 的安装与多端口配置
- 高性能异步web框架Sanic文档【一】