demo效果
增加数据:
删除数据 修改数据
SQLite介绍
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头,SQLite也迎来了一个版本 SQLite 3已经发布。
------(摘自百度百科)
SQLite数据类型
一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种常用的数据类型:
NULL: 这个值为空值;
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000;
CHAR(n):长度固定为n的字串,n不能超过 254;
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8;
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号;
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE);
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改 变格式;
DATA :包含了 年份、月份、日期;
TIME: 包含了 小时、分钟、秒;
SQLite常用的方法
方法名称 | 方法表示含义 |
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) 创建数据库 | 打开或创建数据库 |
insert(String table,String nullColumnHack,ContentValues values)插入数据 | 插入一条记录 |
delete(String table,String whereClause,String[] whereArgs)删除数据 | 删除一条记录 |
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) 查找数据 | 查询一条记录 |
update(String table,ContentValues values,String whereClause,String[] whereArgs) 更新数据 | 修改记录 |
execSQL(String sql) | 执行一条SQL语句 |
close() 关闭数据 |
insert插入数据
insert(String table,String nullColumnHack,ContentValues values)
传入的参数:1,表名,2,空列的默认值,3,ContentValues,类似于hashMap,是一种储存的机制,用法为:
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/** * 创建一个用来插入数据的方法 * * @param name 姓名 * @param sex 性别 * @param age 年龄 * @param hobby 爱好 */ public void insert(String name, String sex, String age, String hobby) { //让数据库可写 SQLiteDatabase database = getWritableDatabase(); /* 类似于HashMap 都有键值对 key 对应的列表中的某一列的名称,字段 value 对应字段要插入的值 */ ContentValues values = new ContentValues(); values.put("name", name); values.put("sex", sex); values.put("age", age); values.put("hobby", hobby); //插入 database.insert(TABLE_NAME, null, values); //插入完成后关闭,以免造成内存泄漏 database.close(); }
delete删除数据
delete(String table,String whereClause,String[] whereArgs)
传入的参数:参数1, 表名称 参数2 , 删除条件参数3 , 删除条件值数组,用法为:
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/** * 创建一个删除数据的方法,传入的参数越多,删除时越精确的找到要删除的哪一行 * * @param name * @param sex * @param age * @param hobby */ public void delete(int id, String name, String sex, String age, String hobby) { SQLiteDatabase database = getWritableDatabase(); /* 删除的条件,当id = 传入的参数id时,sex = 传入的参数sex时,age = 传入的age,hobby = 传入的hobby时 当条件都满足时才删除这行数据,一个条件不满足就删除失败 */ String where = "id=? and name = ? and sex = ? and age = ? and hobby = ?"; //删除条件的参数 String[] whereArgs = {id + "", name, sex, age, hobby}; database.delete(TABLE_NAME, where, whereArgs); database.close(); } /** * 再创建一个删除一个删除的方法,条件只有一个 */ public void delete(int id) { SQLiteDatabase database = getWritableDatabase(); //当条件满足id = 传入的参数的时候,就删除那整行数据,有可能有好几行都满足这个条件,满足的全部都删除 String where = "id = ?"; String[] whereArgs = {id + ""}; database.delete(TABLE_NAME, where, whereArgs); database.close(); }
updata修改数据
update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
传入的参数:参数1 表名称 参数2 跟行列ContentValues类型的键值对Key-Value
参数3 更新条件(where字句) 参数4 更新条件数组
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/** * 创建一个修改数据的方法 * @param id 条件,修改id为"id"的那一行数据 * @param name * @param sex * @param age * @param hobby */ public void updata(int id,String name, String sex, String age, String hobby) { SQLiteDatabase database = getWritableDatabase(); // update(String table,ContentValues values,String whereClause, String[] whereArgs) String where = "id = ?"; String[] whereArgs = {id+""}; ContentValues values = new ContentValues(); values.put("name", name); values.put("sex", sex); values.put("age", age); values.put("hobby", hobby); //参数1 表名称 参数2 跟行列ContentValues类型的键值对Key-Value // 参数3 更新条件(where字句) 参数4 更新条件数组 database.update(TABLE_NAME, values,where, whereArgs); database.close();
query查找数据
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)
传入参数:参数table:表名称 参数columns:列名称数组 参数selection:条件字句,相当于where 参数selectionArgs:条件字句,参数数组
参数groupBy:分组列 参数having:分组条件 参数orderBy:排序列 参数limit:分页查询限制
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/** * 创建一个查找数据库的方法 * * public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit); 各个参数的意义说明: 参数table:表名称 参数columns:列名称数组 参数selection:条件字句,相当于where 参数selectionArgs:条件字句,参数数组 参数groupBy:分组列 参数having:分组条件 参数orderBy:排序列 参数limit:分页查询限制 参数Cursor:返回值,相当于结果集ResultSet Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等. */ public Cursor query() { //数据库可读 SQLiteDatabase database = getReadableDatabase(); //查找 Cursor query = database.query(TABLE_NAME, null, null, null, null, null, null); return query; }
循环遍历,拿到数据
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/** * 通过查找数据库,拿到里面的数据 */ private List<Map<String, Object>> getData() { list = new ArrayList<>(); Cursor query = MyDataBase.getInstances(MainActivity.this).query(); /* 游标cursor默认是在-1的位置,query.moveToFirst()将游标移动到第一行,如果不写这个就会报 Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 12 这个问题坑爹,以后一定要注意 */ if (query.moveToFirst()) { do { String name = query.getString(query.getColumnIndex("name")); String sex = query.getString(query.getColumnIndex("sex")); String age = query.getString(query.getColumnIndex("age")); String hobby = query.getString(query.getColumnIndex("hobby")); int id = query.getInt(query.getColumnIndex("id")); Map<String, Object> map = new HashMap<>(); map.put("id", id); map.put("name", name); map.put("sex", sex); map.put("age", age); map.put("hobby", hobby); list.add(map); } while (query.moveToNext()); } //关闭查询游标 query.close(); return list; }
demo具体实现
操作数据库的类
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177package com.duanlian.databasedemo; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; /** * Created by duanlian on 2016/9/13. */ public class MyDataBase extends SQLiteOpenHelper { //数据库名字 public static final String DB_NAME = "Students.db"; //数据库版本 public static final int DB_VERSION = 1; //表名 public static final String TABLE_NAME = "student"; public static MyDataBase myDataBase; /** * 单例模式返回数据库 * * @param context 上下文 * @return 数据库对象 */ public static MyDataBase getInstances(Context context) { if (myDataBase == null) { return new MyDataBase(context); } else { return myDataBase; } } //上下文,数据库名字,数据库工厂,版本号 public MyDataBase(Context context) { super(context, DB_NAME, null, DB_VERSION); } //此方法中创建表 @Override public void onCreate(SQLiteDatabase sqLiteDatabase) { //这个有个坑,create table"+" " + TABLE_NAME 中间一定要加空格,别问为什么,我也不知道,不加就语法错误,吐血 sqLiteDatabase.execSQL("create table" + " " + TABLE_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT,name text,sex text,age text,hobby text);"); } /** * 用来更新数据库版本的 * onCreate方法只是在第一次安装app的时候会调用,之后的数据库要更改的话,必须使用数据库版本上升,或者卸载了重新安装 * * @param sqLiteDatabase 数据库 * @param oldVersion 老的版本号 * @param newVersion 更新后的版本号 */ @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { if (newVersion > oldVersion) { //删除老表 sqLiteDatabase.execSQL("drop" + TABLE_NAME); //重新创建表 onCreate(sqLiteDatabase); } } /** * 创建一个用来插入数据的方法 * * @param name 姓名 * @param sex 性别 * @param age 年龄 * @param hobby 爱好 */ public void insert(String name, String sex, String age, String hobby) { //让数据库可写 SQLiteDatabase database = getWritableDatabase(); /* 类似于HashMap 都有键值对 key 对应的列表中的某一列的名称,字段 value 对应字段要插入的值 */ ContentValues values = new ContentValues(); values.put("name", name); values.put("sex", sex); values.put("age", age); values.put("hobby", hobby); //插入 database.insert(TABLE_NAME, null, values); //插入完成后关闭,以免造成内存泄漏 database.close(); } /** * 创建一个查找数据库的方法 * * public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit); 各个参数的意义说明: 参数table:表名称 参数columns:列名称数组 参数selection:条件字句,相当于where 参数selectionArgs:条件字句,参数数组 参数groupBy:分组列 参数having:分组条件 参数orderBy:排序列 参数limit:分页查询限制 参数Cursor:返回值,相当于结果集ResultSet Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等. */ public Cursor query() { //数据库可读 SQLiteDatabase database = getReadableDatabase(); //查找 Cursor query = database.query(TABLE_NAME, null, null, null, null, null, null); return query; } /** * 创建一个删除数据的方法,传入的参数越多,删除时越精确的找到要删除的哪一行 * * @param name * @param sex * @param age * @param hobby */ public void delete(int id, String name, String sex, String age, String hobby) { SQLiteDatabase database = getWritableDatabase(); /* 删除的条件,当id = 传入的参数id时,sex = 传入的参数sex时,age = 传入的age,hobby = 传入的hobby时 当条件都满足时才删除这行数据,一个条件不满足就删除失败 */ String where = "id=? and name = ? and sex = ? and age = ? and hobby = ?"; //删除条件的参数 String[] whereArgs = {id + "", name, sex, age, hobby}; database.delete(TABLE_NAME, where, whereArgs); database.close(); } /** * 再创建一个删除一个删除的方法,条件只有一个 */ public void delete(int id) { SQLiteDatabase database = getWritableDatabase(); //当条件满足id = 传入的参数的时候,就删除那整行数据,有可能有好几行都满足这个条件,满足的全部都删除 String where = "id = ?"; String[] whereArgs = {id + ""}; database.delete(TABLE_NAME, where, whereArgs); database.close(); } /** * 创建一个修改数据的方法 * @param id 条件,修改id为"id"的那一行数据 * @param name * @param sex * @param age * @param hobby */ public void updata(int id,String name, String sex, String age, String hobby) { SQLiteDatabase database = getWritableDatabase(); // update(String table,ContentValues values,String whereClause, String[] whereArgs) String where = "id = ?"; String[] whereArgs = {id+""}; ContentValues values = new ContentValues(); values.put("name", name); values.put("sex", sex); values.put("age", age); values.put("hobby", hobby); //参数1 表名称 参数2 跟行列ContentValues类型的键值对Key-Value // 参数3 更新条件(where字句) 参数4 更新条件数组 database.update(TABLE_NAME, values,where, whereArgs); database.close(); } }
mainActivity里面的代码逻辑
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183package com.duanlian.databasedemo; import android.content.DialogInterface; import android.content.Intent; import android.database.Cursor; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; import com.duanlian.databasedemo.adapter.MyListViewAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends AppCompatActivity { private List<Map<String, Object>> list; private MyListViewAdapter adapter; private ListView mListView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setListener(); } private void initView() { mListView = (ListView) findViewById(R.id.main_listview); List<Map<String, Object>> data = getData(); adapter = new MyListViewAdapter(this, data); mListView.setAdapter(adapter); adapter.notifyDataSetChanged(); } private void setListener() { //点击跳转 findViewById(R.id.insert).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(MainActivity.this, AddActivity.class); startActivityForResult(intent, 0); } }); //ListView的监听事件 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { // private int id; @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { // //删除是要拿到当前行的id值才能删除当前行,下面的操作都是点击某个item拿到对应item的id字段 // //拿到当前position的 item的所有数据 // //返回的数据格式为{name=段炼, age=25, sex=男, id=12, hobby=吃饭。睡觉} // Object itemAtPosition = mListView.getItemAtPosition(position); // Log.e("duanlian", itemAtPosition+""); // //转换成String // String s = itemAtPosition.toString(); // //如果字符串包含"id"字段 // if (s.contains("id")) { // //拿到id字段是处于字符串第几个位置 // int a = s.indexOf("id"); // //"id"字段后面是"hobby"字段,拿到hobby字段的位置 // int b = s.indexOf("hobby"); // //切割字符串{name=段炼, age=25, sex=男, id=12, hobby=吃饭。睡觉} // //从i开始+3个正好是id开始的地方,hobby-2正好是id结束的位置减去了一个h和一个逗号 // String substring = s.substring(a + 3, b-2); // //得到id后转换成int类型 // id = Integer.parseInt(substring); // } // //将得到id传入到需要的方法中 // showMyDialog(id, position); //得到对应item里面的id Object id = list.get(position).get("id"); int i = Integer.parseInt(id.toString()); String name = list.get(position).get("name").toString(); String sex = list.get(position).get("sex").toString(); String age = list.get(position).get("age").toString(); String hobby = list.get(position).get("hobby").toString(); //将得到id传入到需要的方法中 showMyDialog(i, name, sex, age, hobby); } }); } /** * 点击显示对话框选择修改或者是删除 */ private void showMyDialog(final int id, final String name, final String sex, final String age, final String hobby) { final AlertDialog.Builder builder = new AlertDialog.Builder(this); //设置一个标题 builder.setTitle("请选择"); //给dialog设置item builder.setItems(new String[]{"修改", "删除"}, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int position) { switch (position) { case 0://修改 Intent intent = new Intent(MainActivity.this, CorrectActivity.class); intent.putExtra("id", id); intent.putExtra("name", name); intent.putExtra("sex", sex); intent.putExtra("age", age); intent.putExtra("hobby", hobby); startActivityForResult(intent,0); break; case 1://删除 MyDataBase.getInstances(MainActivity.this).delete(id); //重新查询,然后显示 List<Map<String, Object>> data = getData(); adapter.refreshList(data); Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show(); break; } } }); builder.show(); } /** * 通过查找数据库,拿到里面的数据 */ private List<Map<String, Object>> getData() { list = new ArrayList<>(); Cursor query = MyDataBase.getInstances(MainActivity.this).query(); /* 游标cursor默认是在-1的位置,query.moveToFirst()将游标移动到第一行,如果不写这个就会报 Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 12 这个问题坑爹,以后一定要注意 */ if (query.moveToFirst()) { do { String name = query.getString(query.getColumnIndex("name")); String sex = query.getString(query.getColumnIndex("sex")); String age = query.getString(query.getColumnIndex("age")); String hobby = query.getString(query.getColumnIndex("hobby")); int id = query.getInt(query.getColumnIndex("id")); Map<String, Object> map = new HashMap<>(); map.put("id", id); map.put("name", name); map.put("sex", sex); map.put("age", age); map.put("hobby", hobby); list.add(map); } while (query.moveToNext()); } //关闭查询游标 query.close(); return list; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 0) { List<Map<String, Object>> data1 = getData(); // adapter = new MyListViewAdapter(this, data1); // mListView.setAdapter(adapter); adapter.refreshList(data1); } } }
插入数据逻辑
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
34package com.duanlian.databasedemo; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.EditText; public class AddActivity extends AppCompatActivity { private EditText edt_name; private EditText edt_sex; private EditText edt_age; private EditText edt_hobby; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_add); initView(); } private void initView() { edt_name = (EditText) findViewById(R.id.add_name); edt_sex = (EditText) findViewById(R.id.add_sex); edt_age = (EditText) findViewById(R.id.add_age); edt_hobby = (EditText) findViewById(R.id.add_hobby); } public void add(View view){ //拿到输入的数据 String name = edt_name.getText().toString().trim(); String sex = edt_sex.getText().toString().trim(); String age = edt_age.getText().toString().trim(); String hobby = edt_hobby.getText().toString().trim(); //调用插入方法 MyDataBase.getInstances(AddActivity.this).insert(name,sex,age,hobby); finish(); } }
修改数据逻辑
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
58package com.duanlian.databasedemo; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.EditText; import android.widget.Toast; public class CorrectActivity extends AppCompatActivity { private int id; private String name; private String sex; private String age; private String hobby; private EditText edt_name; private EditText edt_sex; private EditText edt_age; private EditText edt_hobby; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_correct); id = getIntent().getIntExtra("id", 0); name = getIntent().getStringExtra("name"); sex = getIntent().getStringExtra("sex"); age = getIntent().getStringExtra("age"); hobby = getIntent().getStringExtra("hobby"); initView(); } private void initView() { edt_name = (EditText) findViewById(R.id.correct_name); edt_sex = (EditText) findViewById(R.id.correct_sex); edt_age = (EditText) findViewById(R.id.correct_age); edt_hobby = (EditText) findViewById(R.id.correct_hobby); edt_name.setText(name); edt_sex.setText(sex); edt_age.setText(age); edt_hobby.setText(hobby); } public void choose(View view) { switch (view.getId()) { case R.id.correct_cancel: finish(); break; case R.id.correct_sure: //得到输入的 String name = edt_name.getText().toString().trim(); String sex = edt_sex.getText().toString().trim(); String age = edt_age.getText().toString().trim(); String hobby = edt_hobby.getText().toString().trim(); //调用修改方法 MyDataBase.getInstances(CorrectActivity.this).updata(id, name, sex, age, hobby); finish(); break; } } }
demo下载地址:
http://download.csdn.net/detail/dl10210950/9631514
最后
以上就是英勇钥匙最近收集整理的关于Android储存---SQLite数据库的简单使用,实现增删改查demo效果SQLite介绍SQLite数据类型SQLite常用的方法demo具体实现的全部内容,更多相关Android储存---SQLite数据库内容请搜索靠谱客的其他文章。
发表评论 取消回复