一、整体实现步骤
1. 新建布局文件
2. 建立实体类
3. 建立MySqliteOpenHelpter来帮助我们管理数据库
4. 建立数据库适配器,执行具体的CURD操作
5. 建立内容提供者
6. 在第二个应用中调用第一个应用中的内容(这里没有提到权限的事情)
1.新建布局文件
效果
- 布局代码:
1 |
|
2.在Activity中先把事件给写上回头再写全
- 代码
1 | public class MainActivity extends AppCompatActivity { |
3. 建立一个员工实体类
1 | public class Emp { |
员工实体类讲解
- 我这里主要包含三个属性(可以自由发挥)
- 员工编号
- 员工姓名
- 员工年龄
- 实体类可以自己定义,只要符合业务需求即可
4. MySQLiteOpenHelper(名字有点Low~ haha~)
- 代码
1 |
|
SQLiteOpenHelper 管理数据库创建和版本管理的辅助类.。
- SQLiteOpenHelper 是一个抽象类,想要使用它的话,就需要创建一个自己的帮助类去继承它。并复写两个抽象方法
1.1 onCreate():创建时执行,已经存在不执行。
1.2 onUpgrade():版本号不同时执行- 两个重要的实例方法
2.1 getReadableDatabase()
2.2 getWritableDatabase()。
- 这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库)。
- 并返回一个可对数据库进行读写操作的对象。
- 不同处。当数据库不可写入时(如磁盘空间已满)getReadableDatabase() 方法返回的对象将以只读的方式去打开数据库,而 getWritableDatabase() 方法则将出现异常。
- 创建数据库的步骤
构建出 SQLiteOpenHelper 实例。
再调用它的 getReadableDatabase() 或 getWritableDatabase() 方法就能够创建数据库了。
数据库文件会存放在 /data/data//databases/ 目录下。
此时,重写的 onCreate() 方法也会得到执行
- 官方文档:SQLiteOpenHelper
5.定义数据适配器
1.代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
public class DatabaseAdapter {
//持有一个帮助类
MyDatabaseHelper helper;
public DatabaseAdapter(Context context) {
helper = new MyDatabaseHelper(context);
}
//具体的添加操作
public void insert(Emp emp){
//获取写数据库的权限
SQLiteDatabase db =helper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(MyDatabaseHelper.NAME,emp.getName());
values.put(MyDatabaseHelper.AGE,emp.getAge());
//插入操作
db.insert(MyDatabaseHelper.TAB_NAME,null,values);
}
//具体的修改操作
public void update(Emp emp){
//获取写数据的权限
SQLiteDatabase db = helper.getWritableDatabase();
//修改的条件
String whereClause = "id=?";
//修改的条件参数
String[] whereArgs = new String[]{"1"};
//修改的内容
ContentValues values = new ContentValues();
values.put(MyDatabaseHelper.ID,emp.getId());
values.put(MyDatabaseHelper.NAME,emp.getName());
values.put(MyDatabaseHelper.AGE,emp.getAge());
//修改操作
db.update(MyDatabaseHelper.TAB_NAME,values,whereClause,whereArgs);
}
//具体的删除操作
public void delete(int id){
//获取写数据的权限
SQLiteDatabase db = helper.getWritableDatabase();
String whereClause = "id=?";
String[] whereArgs = new String[]{String.valueOf(id)};
db.delete(MyDatabaseHelper.TAB_NAME,whereClause,whereArgs);
}
//具体的查询单个操作
public Emp find(int id){
//创建实体类对象
Emp emp = null;
//获取查询数据的权限
SQLiteDatabase db = helper.getReadableDatabase();
String[] columns = new String[]{MyDatabaseHelper.ID,MyDatabaseHelper.NAME,MyDatabaseHelper.AGE};
String selection = "id=?";
String[] selectionArgs = new String[]{String.valueOf(id)};
Cursor result = db.query(MyDatabaseHelper.TAB_NAME,columns,selection,selectionArgs,null,null,null);
//循环取值
if (result.moveToFirst()){
emp = new Emp();
emp.setId(result.getInt(0));
emp.setName(result.getString(1));
emp.setAge(result.getInt(2));
}
result.close();
return emp;
}
//具体的查询所有操作
public List<Emp> findAll(){
//创建list集合
List<Emp> list = new ArrayList<>();
//获取读取数据库的权限
SQLiteDatabase db = helper.getReadableDatabase();
String[] columns = new String[]{MyDatabaseHelper.ID,MyDatabaseHelper.NAME,MyDatabaseHelper.AGE};
Cursor res = db.query(MyDatabaseHelper.TAB_NAME,columns,"",new String[]{},null,null,null);
while (res.moveToNext()){
Emp emp = new Emp();
emp.setId(res.getInt(0));
emp.setName(res.getString(1));
emp.setAge(res.getInt(2));
list.add(emp);
}
res.close();
return list;
}
//具体的删表操作
public void dropTable(){
//获取写数据的权限
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL(MyDatabaseHelper.DROP_EMP);
}
//具体的建表操作
public void createTable(){
//获取写数据的权限
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL(MyDatabaseHelper.CREATE_EMP);
}
}
讲解
此适配器主要是帮我们具体的实现具体的业务操作而写的,我这里只是练习,未来你需要根据具体的业务去实现
##最后完成这样的效果
开始写内容提供者
1 | /** |
知识点:
- Uri(统一资源表示符)
适合不监测网络连接的通信机制
- 建立内容提供者的目的是提供一种安全的访问形式,就如同防火墙一样,允许可以访问的内容,拒绝一切非法的访问,我们学习内容提供者的目的试了以后能更好的使用系统提供给我们的信息,如果未来你做的应用特别大的时候,里面得数据足够提供一种服务的时候,这个时候内容提供者对你就特别的重要了。
编写另一个应用,模拟查询上一个应用的数据,完成内容提供者的整个流程
- 废话不多说,布局和上面的一样,这里不再写出
1.1 一张截图:
- 我们开始写Activity的内容接收具体代码
1 | public class MainActivity extends AppCompatActivity { |
效果图
总结:
掌握好内容提供者的编写,能够更加的了解内部的机制,有助于我们更好地调用其他应用的数据,我这里没有设定任何的权限,正常来讲,我们可以自定义权限的,这时候调用者访问我们的应用中的数据就必须携带权限才可以,和系统的权限一样,没有权限你看不到,哈哈哈~