Android数据存储之SQLite

2023-05-16

概览
l  概述
l  
CRUD方法详解
l  注意事项
 
概述
对于大量数据的处理,如果不想将数据存于服务器端,Android API提供了对关系数据库SQLite的支持,在android-SDK中tool目录下已经提供了SQLite的应用程序,用于管理数据库中的数据。当android应用使用SQLite进行数据存储的时候,SQLite数据库是以文件的形式存放在SD卡中的。
 
Android API提供了SQLiteDataBase和SQLiteOpenHelp这两个类支持数据的CRUD操作。其中SQLiteOpenHelp对数据库创建、连接管理、版本更新进行了封装。SQLiteDataBase提拱了丰富的增、删、改、查的方法。
 
CRUD方法详解
l  新建数据库
1.        继承SQLiteOpenHelp,重写OnCreate()方法:
 
public class DictionaryOpenHelper extends SQLiteOpenHelper {     private static final int DATABASE_VERSION = 2;    private static final String DICTIONARY_TABLE_NAME = "dictionary";    private static final String DICTIONARY_TABLE_CREATE =                "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +                KEY_WORD + " TEXT, " +                KEY_DEFINITION + " TEXT);";     DictionaryOpenHelper(Context context) {        super(context, DATABASE_NAME, null, DATABASE_VERSION);    }     @Override    public void onCreate(SQLiteDatabase db) {        db.execSQL(DICTIONARY_TABLE_CREATE);    }}
另外值得注意的是,SQLiteOpenHelp类提供的另一个需要重写的方法OnUpgrade(),用于对。
2.        对于继承的SQLiteOpenHelp之后得到的实例,通过getReadableDatabase()和getWritableDatabase()返回一个sqLiteDatabase实例实现对数据库的读与写的相关操作。
SQLiteDataBase  sqLiteDatabase = sqliteOpenHelp. getReadableDatabase ();SQLiteDataBase  sqLiteDatabase = sqliteOpenHelp.getWritableDatabase();

 
3.        sqLiteDatabase类提供的主要方法:
execSQL(String sql)Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data. execSQL(String sql, Object[] bindArgs)Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE. insert(String table, String nullColumnHack, ContentValues values)Convenience method for inserting a row into the database. rawQuery(String sql, String[] selectionArgs, CancellationSignal cancellationSignal)Runs the provided SQL and returns a Cursor over the result set. rawQuery(String sql, String[] selectionArgs)Runs the provided SQL and returns a Cursor over the result set.

 
l  插入数据
ContentValues cv = new ContentValues();        cv.put("name",user.getName());        cv.put("password", user.getPassword());        sqLiteDatabase.insert("user", null,cv);

 
l  查询数据
查询所有数据:
sqLiteDatabase = dbHelper.getReadableDatabase();        Cursor cursor = sqLiteDatabase.rawQuery("select * from user;", null);        while(cursor.moveToNext()){            user = new User();            user.setName(cursor.getString(cursor.getColumnIndex("name")));            user.setPassword(cursor.getString(cursor.getColumnIndex("password")));            list.add(user);        }

 
按ID查询:
User user = new User();        String[] selectionArgs = {String.valueOf(id)};        try {        sqLiteDatabase = dbHelper.getReadableDatabase();        Cursor cursor = sqLiteDatabase.rawQuery("select * from user where _ID=?",selectionArgs);        while(cursor.moveToNext()){            user.setName(cursor.getString(cursor.getColumnIndex("name")));            user.setPassword(cursor.getString(cursor.getColumnIndex("password")));        }

 
l  修改数据
sqLiteDatabase = dbHelper.getWritableDatabase();            String[] whereArgs = {String.valueOf(user.get_ID())};            ContentValues cv = new ContentValues();            cv.put("name", user.getName());            cv.put("password", user.getPassword());            sqLiteDatabase = dbHelper.getReadableDatabase();            sqLiteDatabase.update("user", cv, "_ID=?", whereArgs);

 
l  删除数据
String[] whereArgs = {String.valueOf(id)};            sqLiteDatabase = dbHelper.getWritableDatabase();            sqLiteDatabase.delete("user", "_ID=?", whereArgs);

 
l  值得注意的是,execSQL方法也可以实现上述某些功能,不过根据API,该方法说明如下:

public void execSQL(String sql, Object[] bindArgs) Execute a single SQL statement that is NOT a SELECT/INSERT/UPDATE/DELETE.

官方的建议是不能用此方法执行SELECT/INSERT/UPDATE/DELETE操作:
For INSERT statements, use any of the following instead. 
•insert(String, String, ContentValues)
•insertOrThrow(String, String, ContentValues)
•insertWithOnConflict(String, String, ContentValues, int)

 For UPDATE statements, use any of the following instead. 
•update(String, ContentValues, String, String[])
•updateWithOnConflict(String, ContentValues, String, String[], int)

 For DELETE statements, use any of the following instead. 
•delete(String, String, String[])

 For example, the following are good candidates for using this method: 
•ALTER TABLE
•CREATE or DROP table / trigger / view / index / virtual table
•REINDEX
•RELEASE
•SAVEPOINT
•PRAGMA that returns no data


实现如下:
 

实现如下:
 
增加数据:
Object[]bindArgs = {user.getName(),user.getPassword()};
sqLiteDatabase.execSQL("insert into uservalues(null,?,?);", bindArgs);
 
修改数据:
Object[]whereArgs = {user.getName(),user.getPassword(),String.valueOf(user.get_ID())};
sqLiteDatabase.execSQL("update user setname=?,password=? where _ID=?", whereArgs);
 
删除数据:
String[]whereArgs = {String.valueOf(id)};
sqLiteDatabase.execSQL("delete from user where _ID =?;", whereArgs);
 
注意事项
l  每次事物处理完成后务必记得关闭数据库
l  
SQLite不支持多线程。支持同时打开、读数据库,但是不能同时写。可以通过读写锁来控制多线程的写操作。
 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android数据存储之SQLite 的相关文章

随机推荐

  • 最全CSS各种布局详解

    一 单列布局的实现 1 单列布局中最常用的水平居中的四种方法 同时设置父元素和子元素的样式 xff1a 父元素使用text align实现 xff0c 子元素使用inline block 这里宽高背景只是为了展示 parent text a
  • Android开发的之基本控件和详解四种布局方式

    Android中的控件的使用方式和iOS中控件的使用方式基本相同 xff0c 都是事件驱动 给控件添加事件也有接口回调和委托代理的方式 今天这篇博客就总结一下Android中常用的基本控件以及布局方式 说到布局方式Android和iOS还是
  • 为Android Studio中的SettingsActivity定制任务栏 (Setting Activity其实本质上是从PreferenceActivity中继承过来的)

    Android Studio为开发者提供了很多内建的Activity 其中Settings Activity是非常有用且功能强大的一种内建Activity Setting Activity其实本质上是从PreferenceActivity中
  • Android设置页面PreferenceFragment使用详细+代码分析

    Android设置页面PreferenceFragment使用详细 文章目录Android设置页面PreferenceFragment使用详细一 设置页面核心代码二 设置页面布局核心代码三SettingFragment核心代码四 setti
  • Android Studio 上Activity的互相切换

    Activity上有两个按钮 xff0c 切换到其他两个Activity 1 先创建两个Button xff0c 一个Textview 2 给两个Button添加监听器 xff0c 实现如下代码 public class MainActiv
  • Android中的Intent和Intent-filter总结

    一 xff0e 相关概念 xff08 一 xff09 基本概念 Intent中文意思指 意图 按照Android的设计理念 Android使用Intent来封装程序的 调用意图 不管启动Activity Service BroadcastR
  • C#接口中为什么不能像java那样使用static?

    我印象中java里面的接口使用static final修饰的常量 xff0c 不是成员方法 xff0c 使用static修饰的method放在接口中是无意义的 xff0c 接口是用来抽象的 与Java不同 xff0c C 中的接口不能包含域
  • JVM(2)九个部分 p4

    文章目录 1 九大部分1 1 类加载子系统1 2 方法区1 3 堆1 4 直接内存1 5 jvm栈1 6 本地方法栈1 7 垃圾回收系统1 8 PC寄存器1 9 执行引擎 2 堆 栈 方法区的联系3 Java堆的不同结构4 对象已经死了吗4
  • 通过点击事件监听 setOnClickListener 彻底理解回调-Android

    前言 老司机们对于回调肯定熟悉得不能再熟悉了 但是新司机可能还是一脸懵逼的 xff0c 我比较笨 xff0c 当年懵逼了好久 xff0c 看夏安明的这一篇博客地址 xff0c 虽然下边的留言都是 xff0c 写得好 xff01 懂了懂了 x
  • Java 接口和抽象类可以被new么?——顺便总结内部类

    转载 xff1a https blog csdn net hackersaillen article details 47281549 背景 xff1a 最近有同事跟我说了他面试时遇到的问题 xff0c 考官问 xff1a 接口和抽象类可以
  • java之方法的重写

    方法的重写 xff1a 1 在子类中可以根据需要对从基类中继承来的方法进行重写 2 重写的方法和被重写的方法必须具有相同方法名称 参数列表和返回类型 3 重写方法不能使用比被重写的方法更严格的访问权限 程序code class Person
  • Android中传递对象的三种方法

    Android中 xff0c Activity和Fragment之间传递对象 xff0c 可以通过将对象序列化并存入Bundle或者Intent中进行传递 xff0c 也可以将对象转化为JSON字符串 xff0c 进行传递 序列化对象可以使
  • Android中BroadCastReceiver使用(整理)

    BroadcastReceiver 在Android中 xff0c Broadcast是一种广泛运用的在应用程序之间传输信息的机制 而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件 下面将详
  • Android的联通性---USB主机模式(三)

    获取跟设备通信的权限 在跟USB设备进行通信之前 xff0c 你的应用程序必须要获取用户的许可 注意 xff1a 如果你的应用程序使用Intent过滤器来发现接入的USB设备 xff0c 而且用户允许你的应用程序处理该Intent xff0
  • android USB

    google 在推出API 3 0后 就增加啦USB通讯这块 同时为API 2 3提供啦一个USB通讯吧 xff0c 这样也让2 3有啦USB通讯功能 不过只支持USBAccessory模式 USB通讯分为两种模式 xff1a xff08
  • 入门 Kotlin 和 Java 混合开发

    一 前沿 如果你学习过其他的编程语言 xff0c 你就会发现 Java 的语法很是哆嗦 xff0c 可是我们为什么没有放弃 Java 这门编程语言呢 xff1f 因为 JVM 是一个非常好的平台 xff0c 而且 Java 程序员目前在中国
  • kotlin 和java 混编

    如果你之前使用 Java 语言而没有 Kotlin 开发经验 xff0c 不用担心 xff0c Intellij IDEA 会帮你一键转换 xff0c 将 Java 代码转换成 Kotlin 代码 但是反过来就不行了 在 Mac 上 xff
  • Kotlin 基础语法

    Kotlin 文件以 kt 为后缀 包声明 代码文件的开头一般为包的声明 xff1a package com runoob main import java util fun test class Runoob kotlin源文件不需要相匹
  • ‘break‘ not in the ‘loop‘ or ‘switch‘ context

    使用phpexcel导出表格 xff0c 切换到php7 0报错 错误地址 xff1a FILE ThinkPHP Library Vendor phpexcel PHPExcel Calculation Functions php LIN
  • Android数据存储之SQLite

    概览 l 概述 l CRUD方法详解 l 注意事项 概述 对于大量数据的处理 xff0c 如果不想将数据存于服务器端 xff0c Android API提供了对关系数据库SQLite的支持 xff0c 在android SDK中tool目录