Android中数据库升级说明
- 格式:docx
- 大小:16.53 KB
- 文档页数:2
Android应用程序的自动更新升级(自身升级、通过tomcat)刚入手android一个多月,因公司需要提交技术文档,才写了这个demo测试,想保存下来,以备后用!有什么不对的地方欢迎大家指正,这个示例也是参考了网上别人的demo自己做的。
Android应用程序的升级(自身升级)一、引言:很多的Android应用都具有版本检测和自动更新的功能,用户一键就可以完成软件的升级和更新。
Android应用程序的升级本质上是利用了Linux系统的软件包管理和安装机制,而对于上层这一功能的开发来说很容易,只需要我们开发人员利用Android自带的API就可以实现。
二、功能说明:1、本示例用来实现单个应用程序的自身升级2、程序启动时,连接tomcat7 web服务器进行版本的检测,若有新版本则提示更新3、将从web服务器下载的新版本的APK文件放到sdcard中4、监听新版本的APK应用是否安装完成,如果是,则将下载的apk文件从sdcard中删除三、程序框架流程:四、环境说明:1、服务器端:Ubuntu下的tomcat7web服务器,安装后默认端口是8080,Android模拟器访问时要将apk文件放到/var/lib/tomcat7/webapps/ROOT/目录下,Android模拟器的访问方式是http://10.0.2.2/NewAppSample.apk2、Android模拟器端的开发环境:Ubuntu+eclipse+ADT五、流程详解及关键点说明:(一) 新版本的应用程序(NewAppSample)准备:a) 新建一个android工程,编辑其版本代码为2,高于我们的旧版本用于更新测试,版本名称为1.0.1b) 编辑应用程序对应的版本信息文件version.json说明:后缀为json的文件是一种轻量级的数据交换格式,比xml要快很多,适合于小型数据的网络交换,其实质类似键值对,键用字符串的形式表示与其值用冒号隔开,能存储多种数据类型。
android中SQLite的使用总结,用excSQL和rawQuery方法实现一般得增删改查1:androidmanifest.xml的内容[html]view plaincopy1.<?xml version="1.0" encoding="utf-8"?>2.<manifest xmlns:android="/apk/res/android"3.package="cn.itcast.db"4.android:versionCode="1"5.android:versionName="1.0">6.<application android:icon="@drawable/icon" android:lab el="@string/app_name">7.<uses-library android:name="android.test.runner" />8.<activity android:name=".MainActivity"9.android:label="@string/app_name">10.<intent-filter>11.<action android:name="android.intent.action.MAIN" / >12.<category android:name=" UNCHER" />13.</intent-filter>14.</activity>15.16.</application>17.18.<uses-sdk android:minSdkVersion="8" />19.<!-- 配置测试环境 -->20.<instrumentation android:name="android.test.Instru mentationTestRunner"21.android:targetPackage="cn.itcast.db"22.android:label="T est for My App"/>23.24.</manifest>2:Person类[java]view plaincopy1.package cn.itcast.domain;2.3.public class Person {4.5.private Integer id;6.private String name;7.8.public Person() {9.10.}11.12.public Integer getId() {13.return id;14.}15.16.public void setId(Integer id) {17.this.id = id;18.}19.20.public String getName() {21.return name;22.}23.24.public void setName(String name) { = name;26.}27.28.@Override29.public String toString() {30.return "Person [id=" + id + ", name=" + name + "]";31.}32.33.}3:DBOpenHelper类,该类继承了SQLiteOpenHelper类[java]view plaincopy1.package cn.itcast.service;2.3.import android.content.Context;4.import android.database.sqlite.SQLiteDatabase;5.import android.database.sqlite.SQLiteOpenHelper;6.import android.database.sqlite.SQLiteDatabase.CursorFac tory;7.8.public class DBOpenHelper extends SQLiteOpenHelper {9.10.private static final String DATABASENAME = "cn.itcast. db";11.private static final int DATABASEVERSION = 1;12.13./*14.* 构造函数15.*/16.public DBOpenHelper(Context context) {17.super(context, DATABASENAME, null, DATABASEVERSION);18.}19.20./*21.* 数据库第一次生成时调用该方法,创建一些表或者初始化一些数据22.* @see android.database.sqlite.SQLiteOpenHelper#on Create(android.database.sqlite.SQLiteDatabase)23.*/24.@Override25.public void onCreate(SQLiteDatabase db) {26.db.execSQL("create table person(personid integer pri mary key autoincrement, name varchar(20))");27.}28.29.@Override30.public void onUpgrade(SQLiteDatabase db, int oldVer sion, int newVersion) {31.32.}33.34.}4:PersonService类[java]view plaincopy1.package cn.itcast.service;2.3.import java.util.ArrayList;4.import java.util.List;5.6.import android.content.Context;7.import android.database.Cursor;8.import android.database.sqlite.SQLiteDatabase;9.import cn.itcast.domain.Person;10.11.public class PersonService {12.13.private DBOpenHelper dbOpenHelper;14.15.public PersonService(Context context) {16.this.dbOpenHelper = new DBOpenHelper(context);17.}18.19./*20.* save a person to the database21.*/22.public void save(Person person) {23.SQLiteDatabase database = dbOpenHelper.getWritabl eDatabase();24.database.execSQL("insert into person(name) values (?) ", new Object[]{person.getName()});25.}26.27./*28.* updata a person to the database29.*/30.public void update(Person person) {31.SQLiteDatabase database = dbOpenHelper.getWritabl eDatabase();32.database.execSQL("update person set name=? wherepersonid=?", new Object[]{person.getName(), person.getId()});33.}34.35./*36.* delete a person from the database according to the id37.*/38.public void delete(Integer id) {39.SQLiteDatabase database = dbOpenHelper.getWritabl eDatabase();40.database.execSQL("delete from person where personi d=?", new Object[]{id.toString()});41.}42.43./*44.* find a person from the database according to the id45.*/46.public Person find(Integer id) {47.SQLiteDatabase database = dbOpenHelper.getReadab leDatabase();48.Cursor cursor = database.rawQuery("select * from per son where personid=?", new String[]{id.toString()});49.Person person = null;50.if(cursor.moveT oFirst()) {51.Integer personid = cursor.getInt(cursor.getColumnInd ex("personid"));52.String name = cursor.getString(cursor.getColumnIndex ("name"));53.person = new Person();54.person.setId(personid);56.}57.return person;58.}59.60./*61.* get the data of person accroding to the offset and m axResult62.*/63.public List<Person> getScrollData(Integer offset, Integ er maxResult) {64.SQLiteDatabase database = dbOpenHelper.getReadab leDatabase();65.Cursor cursor = database.rawQuery("select * from per son limit ?,?", new String[] {offset.toString(), maxResult.toString() });66.int idIndex = 0;67.int nameIndex = 0;68.List<Person> personList = null;69.70.if(cursor.getCount() >= 0) {71.idIndex = cursor.getColumnIndex("personid");Index = cursor.getColumnIndex("name");73.personList = new ArrayList<Person>();74.}75.76.while(cursor.moveToNext()) {77.Integer personid = cursor.getInt(idIndex);78.String name = cursor.getString(nameIndex);79.Person person = new Person();81.person.setName(name);82.personList.add(person);83.}84.return personList;85.}86.87./*88.* get the count of the database89.*/90.public long getCount(){91.SQLiteDatabase database = dbOpenHelper.getReadab leDatabase();92.Cursor cursor = database.rawQuery("select count(*) fr om person", null);93.cursor.moveToFirst();94.return cursor.getLong(0);95.}96.97.}5:PersonServiceT est类[java]view plaincopy1.package cn.itcast.db;2.3.import java.util.List;4.5.import android.test.AndroidTestCase;6.import android.util.Log;7.import cn.itcast.domain.Person;8.import cn.itcast.service.DBOpenHelper;9.import cn.itcast.service.PersonService;10.11.public class PersonServiceTest extends AndroidT estCase {12.private static final String TAG = "PersonServiceTest";13.14./*15.* 测试生成数据库的方法16.*/17.public void testCreateDB() throws Throwable {18.DBOpenHelper dbOpenHelper = new DBOpenHelper( this.getContext());19.dbOpenHelper.getWritableDatabase(); //第一次调用该方法会生成数据库20.21.}22.23./*24.* 测试保存方法25.*/26.public void testSave() throws Throwable{27.PersonService personService = new PersonService(this .getContext());28.29.Person person1 = new Person();30.person1.setName("zhangsan");31.personService.save(person1);32.33.Person person2 = new Person();34.person2.setName("lisi");35.personService.save(person2);36.37.Person person3 = new Person();38.person3.setName("wangwu");39.personService.save(person3);40.41.}42.43.public void testDelete() {44.PersonService personService = new PersonService(this .getContext());45.personService.delete(1);46.47.}48.49./*50.* 测试更新方法51.*/52.public void testUpdate() {53.PersonService personService = new PersonService(this .getContext());54.Person person = personService.find(1);55.person.setName("zhaoliu");56.personService.update(person);57.58.}59.60./*61.* 测试获得数据方法63.public void testGetScrollData() throws Throwable{64.PersonService personService = new PersonService(this .getContext());65.List<Person> persons = personService.getScrollData(0 , 3);66.for(Person person : persons) {67.Log.i(TAG, person.toString());68.}69.}70.71./*72.* 测试根据id查找的方法73.*/74.public void testFind() throws Throwable{75.PersonService personService = new PersonService(this .getContext());76.Person person = personService.find(1);77.Log.i(TAG, person.toString());78.79.}80.81./*82.* 测试获得数量的方法83.*/84.public void testGetCount() {85.PersonService personService = new PersonService(this .getContext());86.long count = personService.getCount();87.Log.i(TAG, count + "");89.}。
Android应用开发中的数据库设计教程Android应用开发中的数据库设计是开发人员不可或缺的一部分。
数据库设计负责管理应用程序中的数据,包括存储、检索和操作数据。
正确设计数据库能够提高应用程序的性能和可靠性。
本文将介绍一些在Android应用开发中数据库设计的基本原则和技巧。
一、选择合适的数据库类型在Android应用开发中,有多种可供选择的数据库类型,如SQLite、Realm、ObjectBox等。
在选择数据库类型时,需要考虑以下几个因素:1. 数据库性能:不同的数据库类型拥有不同的性能特点。
SQLite是一种轻量级数据库,适用于小型应用,而Realm和ObjectBox则更适合大型应用。
2. 数据库功能:不同的数据库类型提供的功能不同。
SQLite是一个全功能的关系型数据库,支持复杂的查询和事务处理,而Realm和ObjectBox则提供了更简洁的接口和更高效的数据存储。
3. 数据库易用性:不同的数据库类型在使用上有所差异。
SQLite是Android平台内置的数据库,易于使用和集成。
Realm和ObjectBox则提供了更便捷、直观的API。
二、设计数据库结构好的数据库结构可以提高应用程序的性能和扩展性。
下面是一些设计原则:1. 规范化数据:合理地规范化数据库可以最大程度地减少数据冗余,提高数据一致性。
将重复数据分解成一个单独的表,并通过主键关联。
2. 设计合适的字段:选择合适的字段类型和大小可以减少存储空间和提高查询效率。
例如,使用整数类型存储长整型数据,而不是字符串类型。
3. 添加索引:为经常被查询的字段添加索引可以加快查询速度。
但是,过多或不必要的索引会增加写入和更新操作的时间。
4. 处理关系:若涉及到多对多关系,可以使用关联表或中间表来处理。
此外,了解外键的使用可以确保数据一致性和完整性。
5. 合理约束数据:使用约束可以避免无效或错误的数据插入数据库中,其中包括:主键约束、唯一约束、非空约束等。
在Android应用中利用SQLite进行本地数据库操作随着移动应用的不断发展,电子设备成为人们生活中不可或缺的一部分。
而Android操作系统作为最广泛使用的移动操作系统之一,它提供了强大的开发平台,为开发者们提供了各种各样的开发工具和API。
其中,SQLite作为Android应用中的一种轻量级数据库管理系统,被广泛应用于数据存储和管理。
本文将介绍在Android应用中通过SQLite实现本地数据库操作的方法。
1. 简介SQLite是一种无服务器的自包含的数据库引擎,它在Android操作系统中作为默认的关系型数据库引擎。
它无需独立的服务器进程,将数据库引擎与应用程序合并在一起,使得应用程序可以直接操作数据库。
SQLite在移动设备上非常流行,因为它占用的磁盘空间相对较少,并且提供了性能高效的操作方式。
2. 创建数据库在Android应用中使用SQLite进行本地数据库操作,首先需要创建一个数据库。
Android提供了SQLiteOpenHelper类来管理数据库的创建和升级。
在创建数据库之前,首先需要定义数据库的结构,包括表的结构和字段信息。
接着,通过继承SQLiteOpenHelper类,重写onCreate()方法和onUpgrade()方法,可以自动创建数据库和升级数据库。
3. 创建表使用SQLite进行本地数据库操作时,需要在数据库中创建表来存储数据。
通过执行SQL语句,可以在数据库中创建表以及定义表中的字段信息。
SQLite支持多种数据类型,包括整型、浮点型、文本型等。
通过在SQL语句中指定字段的名称和类型,可以创建适合应用需求的表。
4. 插入数据插入数据是在数据库中进行本地数据库操作的常见操作之一。
通过执行SQL 语句的INSERT INTO语句,可以将数据插入到数据库的表中。
通过使用ContentValues类,可以方便地设置插入数据的字段值。
通过调用SQLiteDatabase 类的insert()方法,可以执行插入数据的操作。
升级迁移说明函尊敬的客户:为了提高用户体验和系统性能,我们计划升级我们的应用程序。
这次升级将包括新功能添加、漏洞修复和系统性能提升。
为了顺利进行升级迁移,我们需要对当前系统进行一些调整和迁移。
在此,我们向您提供升级迁移说明函,希望对您造成的不便敬请谅解。
一、升级时间为了确保升级迁移的顺利进行,我们计划在本周六至周日(2021年7月17日-2021年7月18日)进行升级迁移。
在升级迁移期间,我们的应用程序将无法正常使用。
请您提前备份好重要数据,并做好应用程序无法使用的准备。
二、升级迁移范围本次升级将涉及我们的后台系统,用户界面和数据库。
我们会根据实际情况对每个模块进行相应的升级迁移,以确保升级后的应用程序能够更加稳定和高效地运行。
同时,为了保证用户数据的完整性和安全性,我们也会对数据库进行备份和恢复。
三、升级迁移步骤在升级迁移期间,我们将按照以下步骤进行操作:1、备份当前系统数据在升级迁移开始之前,我们会对当前系统的数据进行备份,以确保数据的完整性和安全性。
备份完成后,我们会开始进行升级迁移操作。
2、停止应用程序服务在升级迁移期间,我们的应用程序将无法正常使用。
为了确保系统升级能够顺利进行,我们将停止应用程序的服务。
在此期间,您将无法使用我们的应用程序。
4、数据恢复和检查在安装新版本之后,我们会对数据库进行恢复,并检查数据的完整性和准确性。
如果发现问题,我们会及时进行修复,并重新进行数据恢复和检查。
5、重启应用程序服务在数据恢复和检查完毕后,我们会重新启动应用程序服务,以确保系统能够顺利运行。
在此期间,您可以重新使用我们的应用程序。
四、升级迁移提醒1、升级迁移期间,为了确保数据的完整性和安全性,我们建议您在升级前备份重要数据,并做好应用程序无法使用的准备。
祝生活愉快!此致敬礼!XXX科技有限公司20XX年7月16日。
android 数据库update用法Android 数据库 Update 用法:在 Android 开发中,我们经常需要对数据库中的数据进行更新操作。
使用Update 语句可以快速修改数据库中的数据。
下面将详细介绍 Android 中数据库Update 的用法。
首先,我们需要使用 SQLiteDatabase 的 update() 方法来执行更新操作。
update() 方法的参数包括表名、值、条件和条件参数。
```java// 创建数据库实例SQLiteDatabase db = getWritableDatabase();// 定义更新的值ContentValues values = new ContentValues();values.put("columnName1", newValue1);values.put("columnName2", newValue2);// 条件语句和条件参数String selection = "columnName3 = ?";String[] selectionArgs = { "conditionParam" };// 执行更新操作int rowsUpdated = db.update("tableName", values, selection, selectionArgs);```在上述代码中,我们先创建了一个 SQLiteDatabase 实例。
接下来,我们定义了一个 ContentValues 对象来存储待更新的值。
`put()` 方法用于指定每个列的新值。
然后,我们定义了一个条件语句 `selection`,用于指定更新的条件。
条件参数`selectionArgs` 是一个字符串数组,用于传递给条件语句中的参数。
最后,我们使用 `update()` 方法执行更新,并将受影响的行数保存在变量 `rowsUpdated` 中。
Android应用开发中的数据库设计和管理在当今移动应用开发行业中,Android平台一直占据着重要地位。
而数据库的设计和管理是Android应用开发中不可或缺的一部分。
本文将探讨Android应用开发中数据库设计和管理的要点,并分享一些实用的技巧和最佳实践。
一、数据库选择在开始开发Android应用之前,选择适合的数据库是至关重要的。
Android平台支持多种数据库类型,包括SQLite、Realm、GreenDAO等。
SQLite是Android平台默认的数据库选择,具有轻量、易于集成和使用的特点,适用于大多数应用。
Realm则是一款功能强大的移动数据库,提供异步查询和实时更新等特性,适用于需要高性能的应用。
GreenDAO是一个快速、低内存占用的对象关系映射(ORM)库,适合需要快速开发的项目。
根据应用的需求和特点选择合适的数据库可以提升开发效率和运行性能。
二、数据库设计良好的数据库设计是确保Android应用顺利运行的基础。
以下是一些数据库设计的要点和建议:1. 数据库表设计:合理划分表的结构,并选择适当的数据类型和主键。
表之间的关系可以通过外键来建立。
2. 数据类型选择:根据数据的特点和大小选择合适的数据类型。
例如,对于存储图片的字段,可以选择BLOB类型。
3. 索引的使用:索引可以提高查询效率,但过多或过少的索引都会影响性能。
根据实际需求选择合适的字段创建索引。
4. 避免冗余数据:冗余数据会浪费存储空间,并且容易导致数据不一致。
在设计数据库时,要避免冗余数据的产生。
5. 数据库安全性:合理设置数据库的权限和访问控制,以保护用户数据的安全。
三、数据库管理良好的数据库管理将确保数据库的稳定性和性能。
以下是一些数据库管理的要点和建议:1. 数据库备份和恢复:定期备份数据库,以防止数据丢失。
同时,要确保备份数据的安全性和完整性。
2. 数据库优化:优化数据库查询以提升性能,如合理设计查询语句、使用索引等。
android OTA 简介OTA 全称 over the air , OTA 升级是 Android 系统提供的标准软件升级方式。
它功能强大,提供了完全升级、增量升级模式,可以通过 SD 卡升级,也可以通过网络升级。
这里,首先介绍SD卡升级,网络升级原理和SD卡大致一样.下面我们将介绍这一过程.在升级前,我们要准备升级包,所有编译好的包都命名为update.zip ,不管是增量升级还是完全升级.1.生成完全升级包../mk prj new./mk prj otapackage编译完成之后,将在\out\target\product\prj\目录下生成prj-ota-eng.root.zip ,这个zip将是我们升级用的包,我们要把他改名为update.zip ,然后copy 到SD卡的根目录下. 在运行上面指令的过程中,同时会在 out\target\product\prj\obj\PACKAGING\target_files_intermediates\ 目录下生成prj-target_files-eng.root.zip 这个文件非常重要,我们将他保存为old.zip它是我们做增量包的基础文件.2.生成增量包.当代码有更新时,我们更新新的代码.同样运行./mk prj otapackage 产生代码更改后的完全升级包. 这时同样会在out\target\product\prj\obj\PACKAGING\target_files_intermediates\ 目录下生成prj-target_files-eng.root.zip我们把它重命名为new.zip ,接下来我们完成生成增量包的最后一步.运行./build/tools/releasetools/ota_from_target_files -i old.zip new.zip diff.zip ,产生new.zip 到old.zip 的增量包diff.zip ,同样我们要把它命名为update.zip ,可以copy 到SD卡的更目录下,做增量式升级使用.(备注:如果升级有特殊的要求,比如格式化data 分区,更新uboot等分区,需要修改ota_from_target_files.py 这个脚本)上面的内容介绍了如何准备update.zip 升级文件.接下来介绍升级过程.先说一下正常开机过程, 按power 键开机,uboot 在运行完之后,将把boot 分区的内容boot.img 文件加载到内存,然后跳转到boot中linux内核的开始位置,运行linux 内核代码,在内核的最后执行正常启动时的init.rc 文件,挂载system分区到/system 目录下,挂载data 分区到 /data 目录下.启动虚拟机等相关的一下服务.要升级程序,开机的时候,需要按住power 和下vol 键,这样uboot 在运行完之后将加载recovery分区的recovery.img 文件到内存.现在我们看一下,recovery.img 这个镜像里面有什么内容.详细的内容我们可以查看build/core/makefile 文件,在这个文件里面我们查找 Recovery image ,从这里开始的内容,主要是打包recovery.img 的内容.关于recovery.img的具体内容,说的简单点,就是linux 内核和将\out\target\product\prj\recovery目录打包成ramdisk 的一个镜像的集合.对比正常开机的boot.img镜像,区别为boot.img 里面的ramdisk镜像是out\target\product\prj\root 打包来的.其内核文件是同一个文件. recovery.img 镜像里面的ramdisk 文件系统包含的用于数据升级相关的bin文件,比如gzip,recovery 等重要的程序.在机器加载recovery.img ,执行完内核后,运行recovery 模式下的init.rc 该文件在bootable\recovery\etc\目录下,我们拿它和正常开机的init.rc 文件相比.发现recovery 模式的init.rc 仅仅新建了几个目录,包括sdcard,用于SD卡的挂载点.启动了2个service,一个ueventd,一个recovery的主菜单程序recovery(该文件是bootable\recovery\recovery.c 编程而成),内容非常简单.在recovery 的主界面,选择更新程序后,recovery将会解压update.zip 文件,执行其中的\META-INF\com\google\android\updater-script ,recovery会对脚本进行解析.下面是这个脚本的部分摘录.show_progress(0.500000, 0);format("yaffs2", "MTD", "system");mount("yaffs2", "MTD", "system", "/system");package_extract_dir("recovery", "/system");package_extract_dir("system", "/system");symlink("toolbox", "/system/bin/cat", "/system/bin/chmod","/system/bin/chown", "/system/bin/cmp", "/system/bin/date",......."/system/bin/wipe");set_perm_recursive(0, 0, 0755, 0644, "/system");........show_progress(0.200000, 10);assert(package_extract_file("boot.img", "/tmp/boot.img"),write_raw_image("/tmp/boot.img", "boot"),delete("/tmp/boot.img"));show_progress(0.100000, 0);unmount("/system");(以上脚本为系统自动生成)从脚本可以看到,首先格式化system区分,然后把updata.zip 里面的system目录的内容解压到system 分区.接着修改system分区下文件的权限.最后将boot.img 镜像写回到boot 分区.从以上的介绍,可以看到android 的功能非常强大,在recovery 模式下,linux 已经已经完全跑了起来.除了apk,jar 不能运行之外,你可以做任何你想做的事情.上面的例子中,更新了system分区和boot分区,如果需要还可以更新 uboot分区,logo分区,格式化data 分区等等 .关于OTA的网络实现,实际上是检查网络上的更新,或者网络通知更新.把更新包(update.zip)下载到本地,在用户的选择下,重启机器自动进入recovery模式,执行上面的过程.。
AndroidSQLite数据库增删改查操作⼀、使⽤嵌⼊式关系型SQLite数据库存储数据在Android平台上,集成了⼀个嵌⼊式关系型数据库——SQLite,SQLite3⽀持NULL、INTEGER、REAL(浮点数字)、 TEXT(字符串⽂本)和BLOB(⼆进制对象)数据类型,虽然它⽀持的类型只有五种,但实际上sqlite3也接受varchar(n)、 char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
SQLite最⼤的特点是你可以把各种类型的数据保存到任何字段中,⽽不⽤关⼼字段声明的数据类型是什么。
例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放⽇期型值。
但有⼀种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数以外的数据时,将会产⽣错误。
另外,在编写CREATE TABLE 语句时,你可以省略跟在字段名称后⾯的数据类型信息,如下⾯语句你可以省略name字段的类型信息:CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))SQLite可以解析⼤部分标准SQL语句,如:查询语句:select * from表名where条件⼦句 group by 分组字句 having ... order by 排序⼦句如:select * from personselect * from person order by id descselect name from person group by name having count(*)>1分页SQL与mysql类似,下⾯SQL语句获取5条记录,跳过前⾯3条记录select * from Account limit 5 offset 3或者select * from Account limit 3,5插⼊语句:insert into 表名(字段列表) values(值列表)。
Andoird的SQLiteOpenHelper类中有一个onUpgrade方法。
帮助文档中只是说当数据库升级时该方法被触发。
经过实践,解决了我一连串的疑问:
1. 帮助文档里说的“数据库升级”是指什么?
你开发了一个程序,当前是1.0版本。
该程序用到了数据库。
到1.1版本时,你在数据库的某个表中增加了一个字段。
那么软件1.0版本用的数据库在软件1.1版本就要被升级了。
2. 数据库升级应该注意什么?
软件的1.0版本升级到1.1版本时,老的数据不能丢。
那么在1.1版本的程序中就要有地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库。
换句话说,要在1.0软件的数据库的那个表中增加那个字段,并赋予这个字段默认值。
3. 程序如何知道数据库需要升级?
SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。
比如在软件1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。
到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类,用于访问新的数据库,比如2。
当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。
4. 何时触发数据库升级?如何升级?
当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。
根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。
新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。
升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。
参考:StackOverFlow对“数据库版本在数据库中的存储位置”的问答。
本文由淄博SEO(),淄博网站优化()整理发布,转载请注明出处。