SQL数据库全解析
前言
- 在
Android
开发中,主要的数据存储有5种,具体如下
其中,SQLite
数据库的存储方式 非常常用
- 今天我将带大家全面了解关于
Android
SQLite
数据库的操作(增、删、查、改)
Carson带你学Android系列文章
Carson带你学Android:学习方法
Carson带你学Android:四大组件
Carson带你学Android:自定义View
Carson带你学Android:异步-多线程
Carson带你学Android:性能优化
Carson带你学Android:动画
目录
1. SQLlite数据库 简介
2. SQLiteOpenHelper类
2.1 简介
2.2 SQLiteOpenHelper类 常用方法
1 /** 2 * 创建数据库 3 */ 4 // 1. 创建 or 打开 可读/写的数据库(通过 返回的SQLiteDatabase对象 进行操作) 5 getWritableDatabase() 6 7 // 2. 创建 or 打开 可读的数据库(通过 返回的SQLiteDatabase对象 进行操作) 8 getReadableDatabase() 9 10 // 3. 数据库第1次创建时 则会调用,即 第1次调用 getWritableDatabase() / getReadableDatabase()时调用 11 // 在继承SQLiteOpenHelper类的子类中复写 12 onCreate(SQLiteDatabase db) 13 14 // 4. 数据库升级时自动调用 15 // 在继承SQLiteOpenHelper类的子类中复写 16 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 17 18 // 5. 关闭数据库 19 close() 20 21 /** 22 * 数据库操作(增、删、减、查) 23 */ 24 // 1. 查询数据 25 (Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) 26 // 查询指定的数据表返回一个带游标的数据集。 27 // 各参数说明: 28 // table:表名称 29 // colums:列名称数组 30 // selection:条件子句,相当于where 31 // selectionArgs:条件语句的参数数组 32 // groupBy:分组 33 // having:分组条件 34 // orderBy:排序类 35 // limit:分页查询的限制 36 // Cursor:返回值,相当于结果集ResultSet 37 38 (Cursor) rawQuery(String sql, String[] selectionArgs) 39 //运行一个预置的SQL语句,返回带游标的数据集(与上面的语句最大的区别 = 防止SQL注入) 40 41 // 2. 删除数据行 42 (int) delete(String table,String whereClause,String[] whereArgs) 43 44 // 3. 添加数据行 45 (long) insert(String table,String nullColumnHack,ContentValues values) 46 47 // 4. 更新数据行 48 (int) update(String table, ContentValues values, String whereClause, String[] whereArgs) 49 50 // 5. 执行一个SQL语句,可以是一个select or 其他sql语句 51 // 即 直接使用String类型传入sql语句 & 执行 52 (void) execSQL(String sql)
3. 具体使用
- 使用步骤 = 自定义数据库子类(继承
SQLiteOpenHelper
类)、创建数据库 & 操作数据库(增、删、查、改) - 下面,我将逐一介绍每个步骤
3.1 自定义数据库子类(继承 SQLiteOpenHelper 类)
1 /** 2 * 创建数据库子类,继承自SQLiteOpenHelper类 3 * 需 复写 onCreat()、onUpgrade() 4 */ 5 public class DatabaseHelper extends SQLiteOpenHelper { 6 7 // 数据库版本号 8 private static Integer Version = 1; 9 10 /** 11 * 构造函数 12 * 在SQLiteOpenHelper的子类中,必须有该构造函数 13 */ 14 public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, 15 int version) { 16 // 参数说明 17 // context:上下文对象 18 // name:数据库名称 19 // param:一个可选的游标工厂(通常是 Null) 20 // version:当前数据库的版本,值必须是整数并且是递增的状态 21 22 // 必须通过super调用父类的构造函数 23 super(context, name, factory, version); 24 } 25 26 /** 27 * 复写onCreate() 28 * 调用时刻:当数据库第1次创建时调用 29 * 作用:创建数据库 表 & 初始化数据 30 * SQLite数据库创建支持的数据类型: 整型数据、字符串类型、日期类型、二进制 31 */ 32 @Override 33 public void onCreate(SQLiteDatabase db) { 34 // 创建数据库1张表 35 // 通过execSQL()执行SQL语句(此处创建了1个名为person的表) 36 String sql = "create table person(id integer primary key autoincrement,name varchar(64),address varchar(64))"; 37 db.execSQL(sql); 38 39 // 注:数据库实际上是没被创建 / 打开的(因该方法还没调用) 40 // 直到getWritableDatabase() / getReadableDatabase() 第一次被调用时才会进行创建 / 打开 41 } 42 43 /** 44 * 复写onUpgrade() 45 * 调用时刻:当数据库升级时则自动调用(即 数据库版本 发生变化时) 46 * 作用:更新数据库表结构 47 * 注:创建SQLiteOpenHelper子类对象时,必须传入一个version参数,该参数 = 当前数据库版本, 若该版本高于之前版本, 就调用onUpgrade() 48 */ 49 50 @Override 51 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 52 // 参数说明: 53 // db : 数据库 54 // oldVersion : 旧版本数据库 55 // newVersion : 新版本数据库 56 57 // 使用 SQL的ALTER语句 58 String sql = "alter table person add sex varchar(8)"; 59 db.execSQL(sql); 60 } 61 62 }
3.2 创建数据库:getWritableDatabase()、getReadableDatabase()
1 // 步骤1:创建DatabaseHelper对象 2 // 注:此时还未创建数据库 3 SQLiteOpenHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_carson"); 4 5 // 步骤2:真正创建 / 打开数据库 6 SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase(); // 创建 or 打开 可读/写的数据库 7 SQLiteDatabase sqliteDatabase = dbHelper.getReadableDatabase(); // 创建 or 打开 可读的数据库
注:当需操作数据库时,都必须先创建数据库对象 & 创建 / 打开数据库。
- 对于操作 = “增、删、改(更新)”,需获得 可"读 / 写"的权限:
getWritableDatabase()
- 对于操作 = “查询”,需获得 可"读 "的权限
getReadableDatabase()
3.3 操作数据库(增、删、查、改)
1 /** 2 * 1. 创建 & 打开数据库 3 */ 4 5 // a. 创建DatabaseHelper对象 6 // 注:一定要传入最新的数据库版本号 7 SQLiteOpenHelper dbHelper = new DatabaseHelper(SQLiteActivity.this,"test_carson",2); 8 // b.创建 or 打开 可读/写的数据库 9 SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase(); 10 11 /** 12 * 操作1:插入数据 = insert() 13 */ 14 // a. 创建ContentValues对象 15 ContentValues values = new ContentValues(); 16 17 // b. 向该对象中插入键值对 18 values.put("id", 1); 19 values.put("name", "carson"); 20 //其中,key = 列名,value = 插入的值 21 //注:ContentValues内部实现 = HashMap,区别在于:ContenValues Key只能是String类型,Value可存储基本类型数据 & String类型 22 23 // c. 插入数据到数据库当中:insert() 24 sqliteDatabase.insert("user", null, values); 25 // 参数1:要操作的表名称 26 // 参数2:SQl不允许一个空列,若ContentValues是空,那么这一列被明确的指明为NULL值 27 // 参数3:ContentValues对象 28 // 注:也可采用SQL语句插入 29 String sql = "insert into user (id,name) values (1,'carson')"; 30 db.execSQL(sql) ; 31 32 /** 33 * 操作2:修改数据 = update() 34 */ 35 // a. 创建一个ContentValues对象 36 ContentValues values = new ContentValues(); 37 values.put("name", "zhangsan"); 38 39 // b. 调用update方法修改数据库:将id=1 修改成 name = zhangsan 40 sqliteDatabase.update("user", values, "id=?", new String[] { "1" }); 41 // 参数1:表名(String) 42 // 参数2:需修改的ContentValues对象 43 // 参数3:WHERE表达式(String),需数据更新的行; 若该参数为 null, 就会修改所有行;?号是占位符 44 // 参数4:WHERE选择语句的参数(String[]), 逐个替换 WHERE表达式中 的“?”占位符; 45 46 // 注:调用完upgrate()后,则会回调 数据库子类的onUpgrade() 47 48 // 注:也可采用SQL语句修改 49 String sql = "update [user] set name = 'zhangsan' where id="1"; 50 db.execSQL(sql); 51 52 /** 53 * 操作3:删除数据 = delete() 54 */ 55 // 删除 id = 1的数据 56 sqliteDatabase.delete("user", "id=?", new String[]{"1"}); 57 // 参数1:表名(String) 58 // 参数2:WHERE表达式(String),需删除数据的行; 若该参数为 null, 就会删除所有行;?号是占位符 59 // 参数3:WHERE选择语句的参数(String[]), 逐个替换 WHERE表达式中 的“?”占位符; 60 61 // 注:也可采用SQL语句修改 62 String sql = "delete from user where id="1"; 63 db.execSQL(sql); 64 65 /** 66 * 操作4:查询数据1 = rawQuery() 67 * 直接调用 SELECT 语句 68 */ 69 Cursor c = db.rawQuery("select * from user where id=?",new Stirng[]{"1"}); 70 // 返回值一个 cursor 对象,后面的string数组将逐一对应前面的“?”号。 71 72 // 通过游标的方法可迭代查询结果 73 if(cursor.moveToFirst()) { 74 String password = c.getString(c.getColumnIndex("password")); 75 } 76 77 //Cursor对象常用方法如下: 78 c.move(int offset); //以当前位置为参考,移动到指定行 79 c.moveToFirst(); //移动到第一行 80 c.moveToLast(); //移动到最后一行 81 c.moveToPosition(int position); //移动到指定行 82 c.moveToPrevious(); //移动到前一行 83 c.moveToNext(); //移动到下一行 84 c.isFirst(); //是否指向第一条 85 c.isLast(); //是否指向最后一条 86 c.isBeforeFirst(); //是否指向第一条之前 87 c.isAfterLast(); //是否指向最后一条之后 88 c.isNull(int columnIndex); //指定列是否为空(列基数为0) 89 c.isClosed(); //游标是否已关闭 90 c.getCount(); //总数据项数 91 c.getPosition(); //返回当前游标所指向的行数 92 c.getColumnIndex(String columnName);//返回某列名对应的列索引值 93 c.getString(int columnIndex); //返回当前行指定列的值 94 95 // 通过游标遍历1个名为user的表 96 Cursor result=db.rawQuery("SELECT _id, username, password FROM user"); 97 result.moveToFirst(); 98 while (!result.isAfterLast()) { 99 int id=result.getInt(0); 100 String name=result.getString(1); 101 String password =result.getString(2); 102 // do something useful with these 103 result.moveToNext(); 104 } 105 result.close(); 106 107 108 // 若查询是动态的,使用该方法会复杂。此时使用 query() 会方便很多 109 // 注:无法使用SQL语句,即db.execSQL(sql); 110 111 /** 112 * 操作4:查询数据2 = query() 113 * 直接调用 SELECT 语句 114 */ 115 // 方法说明 116 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy); 117 db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 118 db.query(String distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit); 119 120 // 参数说明 121 // table:要操作的表 122 // columns:查询的列所有名称集 123 // selection:WHERE之后的条件语句,可以使用占位符 124 // groupBy:指定分组的列名 125 // having指定分组条件,配合groupBy使用 126 // orderBy指定排序的列名 127 // limit指定分页参数 128 // distinct可以指定“true”或“false”表示要不要过滤重复值 129 130 // 所有方法将返回一个Cursor对象,代表数据集的游标 131 132 // 具体使用 133 Cursor cursor = sqliteDatabase.query("user", new String[] { "id","name" }, "id=?", new String[] { "1" }, null, null, null); 134 // 参数1:(String)表名 135 // 参数2:(String[])要查询的列名 136 // 参数3:(String)查询条件 137 // 参数4:(String[])查询条件的参数 138 // 参数5:(String)对查询的结果进行分组 139 // 参数6:(String)对分组的结果进行限制 140 // 参数7:(String)对查询的结果进行排序 141 142 // 注:无法使用SQL语句,即db.execSQL(sql); 143 /** 144 * 操作5:关闭数据库 = close() 145 * 注:完成数据库操作后,记得调用close()关闭数据库,从而释放数据库的连接 146 */ 147 sqliteDatabase.close(); 148 149 /** 150 * 操作6:删除数据库 = deleteDatabase() 151 */ 152 // 删除 名为person的数据库 153 deleteDatabase("test.db");
3.4 特别注意
- 除了“查询”,所有的数据库操作都可使用
SQL
语句,即使用下列方法代替:
1 db.executeSQL(String sql); 2 db.executeSQL(String sql, Object[] bindArgs); 3 // sql语句中使用占位符,参数2 = 实际的参数集
- 使用建议:都使用SQL语句,因为:
SQL
语句 通用 & 简单
原生的方法
insert()
、delete()
等方法具备多个参数,使用复杂
4. 实例Demo
- Demo描述:创建数据库 & 对数据库进行操作(增、删、查、改)
- 实现步骤:
- 实现子类继承
SQLiteOpenHelper
类(复写onCreat()
、onUpgrade()
) - 对数据库进行各种操作(增、删、查、改)
- 实现子类继承
###4.1 具体代码如下:
建议先下载Demo再进行阅读:Carson的Github:DataBase_Demo
步骤1:实现子类继承SQLiteOpenHelper类(复写onCreat()、onUpgrade())
MySQLiteOpenHelper.java
1 package scut.carson_ho.database_demo; 2 3 import android.content.Context; 4 import android.database.sqlite.SQLiteDatabase; 5 import android.database.sqlite.SQLiteOpenHelper; 6 7 /** 8 * Created by Carson_Ho on 16/11/18. 9 */ 10 public class MySQLiteOpenHelper extends SQLiteOpenHelper { 11 12 13 //数据库版本号 14 private static Integer Version = 1; 15 16 17 //在SQLiteOpenHelper的子类当中,必须有该构造函数 18 public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, 19 int version) { 20 //必须通过super调用父类当中的构造函数 21 super(context, name, factory, version); 22 } 23 //参数说明 24 //context:上下文对象 25 //name:数据库名称 26 //param:factory 27 //version:当前数据库的版本,值必须是整数并且是递增的状态 28 29 public MySQLiteOpenHelper(Context context,String name,int version) 30 { 31 this(context,name,null,version); 32 } 33 34 35 public MySQLiteOpenHelper(Context context,String name) 36 { 37 this(context, name, Version); 38 } 39 40 //当数据库创建的时候被调用 41 @Override 42 public void onCreate(SQLiteDatabase db) { 43 44 System.out.println("创建数据库和表"); 45 //创建了数据库并创建一个叫records的表 46 //SQLite数据创建支持的数据类型: 整型数据,字符串类型,日期类型,二进制的数据类型 47 String sql = "create table user(id int primary key,name varchar(200))"; 48 //execSQL用于执行SQL语句 49 //完成数据库的创建 50 db.execSQL(sql); 51 //数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开 52 53 54 } 55 56 //数据库升级时调用 57 //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade()方法 58 @Override 59 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 60 System.out.println("更新数据库版本为:"+newVersion); 61 } 62 63 64 }
步骤2:在MainActivity里实现需要进行的数据库操作(增、删、查、改)
MainActivity.java
1 package scut.carson_ho.database_demo; 2 3 import android.content.ContentValues; 4 import android.database.Cursor; 5 import android.database.sqlite.SQLiteDatabase; 6 import android.os.Bundle; 7 import android.support.v7.app.AppCompatActivity; 8 import android.view.View; 9 import android.widget.Button; 10 11 public class MainActivity extends AppCompatActivity implements View.OnClickListener { 12 13 private Button instablish; 14 private Button insert; 15 private Button upgrade; 16 private Button modify; 17 private Button delete; 18 private Button query; 19 private Button delete_database; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 26 //绑定按钮 27 instablish = (Button) findViewById(R.id.instablish); 28 insert = (Button) findViewById(R.id.insert); 29 upgrade = (Button) findViewById(R.id.upgrade); 30 modify = (Button) findViewById(R.id.modify); 31 delete = (Button) findViewById(R.id.delete); 32 query = (Button) findViewById(R.id.query); 33 delete_database = (Button) findViewById(R.id.delete_database); 34 35 //设置监听器 36 instablish.setOnClickListener(this); 37 insert.setOnClickListener(this); 38 upgrade.setOnClickListener(this); 39 modify.setOnClickListener(this); 40 delete.setOnClickListener(this); 41 query.setOnClickListener(this); 42 delete_database.setOnClickListener(this); 43 44 } 45 46 //设置每个按钮对数据库的操作进行控制 47 @Override 48 public void onClick(View v) { 49 switch (v.getId()) { 50 51 52 //点击创建数据库库 53 case R.id.instablish: 54 55 // 创建SQLiteOpenHelper子类对象 56 MySQLiteOpenHelper dbHelper = new MySQLiteOpenHelper(this,"test_carson"); 57 //数据库实际上是没有被创建或者打开的,直到getWritableDatabase() 或者 getReadableDatabase() 方法中的一个被调用时才会进行创建或者打开 58 SQLiteDatabase sqliteDatabase = dbHelper.getWritableDatabase(); 59 // SQLiteDatabase sqliteDatabase = dbHelper.getReadbleDatabase(); 60 61 break; 62 63 //点击更新数据 64 case R.id.upgrade: 65 66 // 创建SQLiteOpenHelper子类对象 67 MySQLiteOpenHelper dbHelper_upgrade = new MySQLiteOpenHelper(this,"test_carson",2); 68 // 调用getWritableDatabase()方法创建或打开一个可以读的数据库 69 SQLiteDatabase sqliteDatabase_upgrade = dbHelper_upgrade.getWritableDatabase(); 70 // SQLiteDatabase sqliteDatabase = dbHelper.getReadbleDatabase(); 71 72 break; 73 74 //点击插入数据到数据库 75 case R.id.insert: 76 77 System.out.println("插入数据"); 78 79 // 创建SQLiteOpenHelper子类对象 80 注意,一定要传入最新的数据库版本号 81 MySQLiteOpenHelper dbHelper1 = new MySQLiteOpenHelper(this,"test_carson",2); 82 // 调用getWritableDatabase()方法创建或打开一个可以读的数据库 83 SQLiteDatabase sqliteDatabase1 = dbHelper1.getWritableDatabase(); 84 85 // 创建ContentValues对象 86 ContentValues values1 = new ContentValues(); 87 88 // 向该对象中插入键值对 89 values1.put("id", 1); 90 values1.put("name", "carson"); 91 92 // 调用insert()方法将数据插入到数据库当中 93 sqliteDatabase1.insert("user", null, values1); 94 95 // sqliteDatabase.execSQL("insert into user (id,name) values (1,'carson')"); 96 97 //关闭数据库 98 sqliteDatabase1.close(); 99 100 break; 101 102 //点击查询数据库 103 case R.id.query: 104 105 System.out.println("查询数据"); 106 107 // 创建DatabaseHelper对象 108 MySQLiteOpenHelper dbHelper4 = new MySQLiteOpenHelper(MainActivity.this,"test_carson",2); 109 110 // 调用getWritableDatabase()方法创建或打开一个可以读的数据库 111 SQLiteDatabase sqliteDatabase4 = dbHelper4.getReadableDatabase(); 112 113 // 调用SQLiteDatabase对象的query方法进行查询 114 // 返回一个Cursor对象:由数据库查询返回的结果集对象 115 Cursor cursor = sqliteDatabase4.query("user", new String[] { "id", 116 "name" }, "id=?", new String[] { "1" }, null, null, null); 117 118 119 String id = null; 120 String name = null; 121 122 //将光标移动到下一行,从而判断该结果集是否还有下一条数据 123 //如果有则返回true,没有则返回false 124 while (cursor.moveToNext()) { 125 id = cursor.getString(cursor.getColumnIndex("id")); 126 name = cursor.getString(cursor.getColumnIndex("name")); 127 //输出查询结果 128 System.out.println("查询到的数据是:"+"id: "+id+" "+"name: "+name); 129 130 } 131 //关闭数据库 132 sqliteDatabase4.close(); 133 134 break; 135 136 137 //点击修改数据 138 case R.id.modify: 139 System.out.println("修改数据"); 140 141 // 创建一个DatabaseHelper对象 142 // 将数据库的版本升级为2 143 // 传入版本号为2,大于旧版本(1),所以会调用onUpgrade()升级数据库 144 MySQLiteOpenHelper dbHelper2 = new MySQLiteOpenHelper(MainActivity.this,"test_carson", 2); 145 146 147 // 调用getWritableDatabase()得到一个可写的SQLiteDatabase对象 148 SQLiteDatabase sqliteDatabase2 = dbHelper2.getWritableDatabase(); 149 150 // 创建一个ContentValues对象 151 ContentValues values2 = new ContentValues(); 152 values2.put("name", "zhangsan"); 153 154 // 调用update方法修改数据库 155 sqliteDatabase2.update("user", values2, "id=?", new String[]{"1"}); 156 157 //关闭数据库 158 sqliteDatabase2.close(); 159 break; 160 161 //点击删除数据 162 case R.id.delete: 163 164 System.out.println("删除数据"); 165 166 // 创建DatabaseHelper对象 167 MySQLiteOpenHelper dbHelper3 = new MySQLiteOpenHelper(MainActivity.this,"test_carson",2); 168 169 // 调用getWritableDatabase()方法创建或打开一个可以读的数据库 170 SQLiteDatabase sqliteDatabase3 = dbHelper3.getWritableDatabase(); 171 172 //删除数据 173 sqliteDatabase3.delete("user", "id=?", new String[]{"1"}); 174 175 //关闭数据库 176 sqliteDatabase3.close(); 177 break; 178 179 180 181 182 //点击删除数据库 183 case R.id.delete_database: 184 185 System.out.println("删除数据库"); 186 187 MySQLiteOpenHelper dbHelper5 = new MySQLiteOpenHelper(MainActivity.this, 188 "test_carson",2); 189 190 // 调用getReadableDatabase()方法创建或打开一个可以读的数据库 191 SQLiteDatabase sqliteDatabase5 = dbHelper5.getReadableDatabase(); 192 193 //删除名为test.db数据库 194 deleteDatabase("test_carson"); 195 break; 196 197 default: 198 break; 199 } 200 } 201 } 202
步骤3:在主布局文件设置按钮控制数据库的操作
activity_main.xml
1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="match_parent" 5 android:layout_height="match_parent" 6 android:paddingBottom="@dimen/activity_vertical_margin" 7 android:paddingLeft="@dimen/activity_horizontal_margin" 8 android:paddingRight="@dimen/activity_horizontal_margin" 9 android:paddingTop="@dimen/activity_vertical_margin" 10 tools:context="scut.carson_ho.database_demo.MainActivity"> 11 12 13 14 <Button 15 android:id="@+id/instablish" 16 android:layout_centerHorizontal="true" 17 android:layout_width="wrap_content" 18 android:layout_height="wrap_content" 19 android:text="创建数据库"/> 20 21 22 23 <Button 24 android:id="@+id/upgrade" 25 android:layout_below="@+id/instablish" 26 android:layout_centerHorizontal="true" 27 android:layout_width="wrap_content" 28 android:layout_height="wrap_content" 29 android:text="更新数据库"/> 30 31 <Button 32 android:id="@+id/insert" 33 android:layout_below="@+id/upgrade" 34 android:layout_centerHorizontal="true" 35 android:layout_width="wrap_content" 36 android:layout_height="wrap_content" 37 android:text="插入数据"/> 38 39 <Button 40 android:id="@+id/modify" 41 android:layout_centerHorizontal="true" 42 android:layout_below="@+id/insert" 43 android:layout_width="wrap_content" 44 android:layout_height="wrap_content" 45 android:text="修改数据"/> 46 47 48 49 <Button 50 android:id="@+id/query" 51 android:layout_centerHorizontal="true" 52 android:layout_below="@+id/modify" 53 android:layout_width="wrap_content" 54 android:layout_height="wrap_content" 55 android:text="查询数据"/> 56 57 <Button 58 android:id="@+id/delete" 59 android:layout_centerHorizontal="true" 60 android:layout_below="@+id/query" 61 android:layout_width="wrap_content" 62 android:layout_height="wrap_content" 63 android:text="删除数据"/> 64 65 66 <Button 67 android:id="@+id/delete_database" 68 android:layout_centerHorizontal="true" 69 android:layout_below="@+id/delete" 70 android:layout_width="wrap_content" 71 android:layout_height="wrap_content" 72 android:text="删除数据库"/> 73 74 75 76 </RelativeLayout>
4.2 测试结果
-
界面显示
-
按顺序点击:创建 - 更新 - 插入 - 查询 - 修改 - 查询 - 删除数据
4.3 Demo地址
5. 总结
- 本文全面介绍了
Android SQLite
数据库中所有知识 - Carson带你学Android系列文
Carson带你学Android:学习方法
Carson带你学Android:四大组件
Carson带你学Android:自定义View
Carson带你学Android:异步-多线程
Carson带你学Android:性能优化
Carson带你学Android:动画