热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQLite(一)基本操作

SQLite的基本操作SQLite数据库主要依靠SQLiteOpenHelper类(数据库帮助类)来实现数据库,数据表的创建,

SQLite的基本操作

 

SQLite数据库主要依靠SQLiteOpenHelper类(数据库帮助类)来实现数据库,数据表的创建,还有使用SQLiteDatabase类(数据库类)来对数据库进行操作。

第一步:创建数据库和数据表

示例代码:为了方便以后的维护,所有我创建了一个类Constant(常量类)来保存常量,这样以后修改数据库的变量名和表明就不需要去程序里面一个个找了

1 public class Constant {
2 public static String DB_NAME = "Text";
3
4 public static String TABLE_NAME = "person";
5 public static String ID = "_id";
6 public static String NAME = "name";
7 public static String AGE = "age";
8 }

 

1 public class MySQLiteOpenHelper extends SQLiteOpenHelper {
2
3 /*
4 * context: 上下文对象
5 * name : 数据库名字
6 * factory: 游标工厂,游标Cursor相当于一个数据表,用来保存数据
7 * version: 数据库版本 >=1
8 */
9 public MySQLiteOpenHelper(Context context, String name,
10 CursorFactory factory, int version) {
11 super(context, name, factory, version);
12 }
13 //这个构造方法是为了简便操作
14 public MySQLiteOpenHelper(Context context){
15 super(context, Constant.DB_NAME, null, 1);
16 }
17
18 //数据库创建时回调
19 public void onCreate(SQLiteDatabase arg0) {
20 String SQL = "create table "+Constant.TABLE_NAME+"("+Constant.ID+" int(4) not null primary key,"+Constant.AGE+" int(2) not null,"+Constant.NAME+" char(20))";
21 arg0.execSQL(SQL);
22 }
23
24 //数据库更新时回调
25 public void onUpgrade(SQLiteDatabase arg0, int oldVersion, int newVersion) {
26 }
27 //数据库打开时回调,一般不重写
28 public void onOpen(SQLiteDatabase arg0){
29 }
30
31 }

我们把应用的所有要使用的数据表都创建好在这个类,使用数据的时候也不需要动这个类了,因为一般应用使用时(除了第一次使用)都不需要额外的创建数据库。

MySQLiteOpenHelper helper = new MySQLiteOpenHelper(this);

SQLiteDatabase DB = helper.getWritableDatabase();

执行这两条方法后,就可以创建好MySQLiteOpenHelpe中创建的所有数据表保存在DB对象中了。

这里的getWritableDatabase();和getReadableDatabase()方法在一般情况下没什么区别,但在内存满了之后,getReadableDatabase()只能读不能写数据库。

第二部:定义数据库操作类,SQLite有两种方法对数据库进行操作,第一种是用SQL语句,第二种是用安卓自带的API方法。

第一种的示例代码:

1 public class DBoperation2 {
2 SQLiteDatabase DB = null;
3 public DBoperation2(SQLiteDatabase DB){
4 this.DB = DB;
5 }
6 //用sql语句实现增删改,实际运用中适当的让某些变量拆解SQL语句,让人机交互更和谐
7 public void SQL(SQLiteDatabase DB, String SQL){
8 if(DB != null){
9 DB.execSQL(SQL);
10 }
11 }
12 //用sql语句实现查询
13 public Cursor SQLSEL(SQLiteDatabase DB, String SQL, String[] where){
14 Cursor cursor = null;
15 if(DB != null){
16 cursor = DB.rawQuery(SQL, where);
17 }
18 return cursor;
19 }
20 }

即用数据库类的exeSQL方法直接执行SQL语句,缺点是方法没用返回值,比较难用来判断是否执行成功。具体的操作方法参数根据实际情况定义,这里暂时不展示。

第二种的示例代码:

1 public class DBoperation {
2 SQLiteDatabase DB = null;
3 public DBoperation(SQLiteDatabase DB){
4 this.DB = DB;
5 }
6 /*
7 * 增: insert(table, nullColumnHack, values)
8 * String table : 要插入的表的名字
9 * nullColumHack: 空列填充,默认值
10 * ContentValues values: 要插入的数据(id,name即插入的数据)
11 * 返回值为大于0的数时表示insert()方法执行成功
12 */
13 public long Insert(int id, int age, String name){
14 ContentValues values = new ContentValues();
15 values.put(Constant.ID, id);
16 values.put(Constant.AGE, age);
17 values.put(Constant.NAME, name);
18 long i = DB.insert(Constant.TABLE_NAME, null, values);
19 return i;
20 }
21 /*
22 * 删: delete(table, whereClause, whereArgs)
23 * String table: 要删除表的名字
24 * String whereClause: 删除的条件
25 * String[] whereArgs: 删除条件的占位符
26 * 占位符解释: ①:DB.delete(Constant.TABLE_NAME, Constant.ID+"=1", null);
27 * ②:DB.delete(Constant.TABLE_NAME, Constant.ID+"=?",new String[1]);效果一致
28 * 返回值为大于0的数时表示Delete()方法执行成功,这里是根据ID来删除,按实际情况更改
29 */
30 public long Delete(int age){
31 long i = DB.delete(Constant.TABLE_NAME, Constant.AGE+"="+age, null);
32 return i;
33 }
34 /*
35 * 改: update(table, values, whereClause, whereArgs)
36 * String table: 要更新表的名字
37 * ContentValues values: 要更新的数据(name即更新的内容)
38 * String whereClause: 更新的条件
39 * String[] whereArgs: 更新条件的占位符
40 * 返回值是一个整形表示更新的行数,这里是根据ID更新,根据实际情况更改。
41 */
42 public int Updata(String name, int age){
43 ContentValues values = new ContentValues();
44 values.put(Constant.NAME, name);
45 int i = DB.update(Constant.TABLE_NAME, values, Constant.AGE+"="+age, null);
46 return i;
47 }
48 /*
49 * 查询: query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
50 * String table: 要查询的表名字
51 * String[] columns: 要查询显示的列
52 * String selection: 查询条件
53 * String[] selectionArgs: 查询条件的占位符
54 * String groupBy: String having: String orderBy
55 * 返回只是一个游标。
56 */
57 public Cursor Select(String[] columns, String selection, String[] selectionArgs){
58 Cursor cursor = DB.query(Constant.TABLE_NAME, columns, selection, selectionArgs, null, null, null);
59 return cursor;
60 }
61 }

代码中已经有详细的注释,具体方法的构造和参数可以根据自己的需求改造。

接下来,展示一下上面的方法。

为了方便,我把插入的年龄都定义为1,名字都为LWJ,删除和更新的条件都是年龄为1.所有更新和删除都是回把全部内容都改的。查询则是查询所有内容,查询实则在前面的增删改后都执行了一次。

示例代码:

1 public class MainActivity extends Activity {
2
3 private MySQLiteOpenHelper helper = null;
4 private DBoperation operation = null;
5 private Cursor cursor = null;
6 private ListView lv = null;
7 private int n = 1;
8 @Override
9 protected void onCreate(Bundle savedInstanceState) {
10 super.onCreate(savedInstanceState);
11 setContentView(R.layout.activity_main);
12 lv = (ListView)findViewById(R.id.lv);
13 if(helper == null){
14 helper = new MySQLiteOpenHelper(this);
15 }
16 }
17 //这里的条件可以根据需要输入来操作,我这里是为了方便
18 public void Click(View v){
19 SQLiteDatabase DB = helper.getWritableDatabase();
20 operation = new DBoperation(DB);
21 switch(v.getId()){
22 case R.id.insert :
23 long i = operation.Insert(n,1,"LWJ");
24 if(i > 0){
25 Toast toast = Toast.makeText(MainActivity.this, "插入成功", Toast.LENGTH_SHORT);
26 toast.show();
27 } else {
28 Toast toast = Toast.makeText(MainActivity.this, "插入失败", Toast.LENGTH_SHORT);
29 toast.show();
30 }
31 n++;
32 Show2(DB);
33 DB.close();
34 break;
35 case R.id.delete :
36 long d = operation.Delete(1);
37 if( d >0){
38 Toast toast = Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT);
39 toast.show();
40 } else {
41 Toast toast = Toast.makeText(MainActivity.this, "删除失败", Toast.LENGTH_SHORT);
42 toast.show();
43 }
44 Show2(DB);
45 DB.close();
46 break;
47 case R.id.updata :
48 int u = operation.Updata("lwj", 1);
49 if( u >0){
50 Toast toast = Toast.makeText(MainActivity.this, "更新成功", Toast.LENGTH_SHORT);
51 toast.show();
52 } else {
53 Toast toast = Toast.makeText(MainActivity.this, "更新失败", Toast.LENGTH_SHORT);
54 toast.show();
55 }
56 Show2(DB);
57 DB.close();
58 break;
59 case R.id.select :
60 Show(DB);
61 DB.close();
62 break;
63 }
64 }
65 }

这里的show()和Show2()方法是下一篇讲适配器的时候再解释,知道他是把数据库里面的内容展示再ListView里面的就可以了。

Click方法是layou文件t定义按钮响应的方法名字。

结果:

      

这里解释一下如何在layout文件中定义Click方法:

只需要在控件的属性中添加:android:onClick="Click" 就ok拉。

 

如果有什么错误,或者我理解错误或不当的,恳请大家纠正,谢谢!嘻嘻嘻~

 

转:https://www.cnblogs.com/xiaolai1995/p/6502530.html



推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • 本文详细介绍了MySQL表分区的创建、增加和删除方法,包括查看分区数据量和全库数据量的方法。欢迎大家阅读并给予点评。 ... [详细]
author-avatar
采蘑菇的灵的fans
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有