热门标签 | 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



推荐阅读
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Java 中的 BigDecimal pow()方法,示例 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文介绍了如何在C#中启动一个应用程序,并通过枚举窗口来获取其主窗口句柄。当使用Process类启动程序时,我们通常只能获得进程的句柄,而主窗口句柄可能为0。因此,我们需要使用API函数和回调机制来准确获取主窗口句柄。 ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细介绍了Java中的访问器(getter)和修改器(setter),探讨了它们在保护数据完整性、增强代码可维护性方面的重要作用。通过具体示例,展示了如何正确使用这些方法来控制类属性的访问和更新。 ... [详细]
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • Java 类成员初始化顺序与数组创建
    本文探讨了Java中类成员的初始化顺序、静态引入、可变参数以及finalize方法的应用。通过具体的代码示例,详细解释了这些概念及其在实际编程中的使用。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 本文详细介绍了Java中org.w3c.dom.Text类的splitText()方法,通过多个代码示例展示了其实际应用。该方法用于将文本节点在指定位置拆分为两个节点,并保持在文档树中。 ... [详细]
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社区 版权所有