AndrOiddata数据库
第4章 Android中的数据存储

第4章Android中的数据存取程序是数据的输入、处理、输出的过程,不管是操作系统还是应用程序,都不可避免要用到大量的数据。
由于内存容量有限,且一旦关机,内存中的信息都消失,因此,一般把需要下次使用的数据保存在磁盘(对于手机来说SD卡)中。
操作系统一般以文件的形式来保存数据,而应用程序更喜欢使用数据库来保存。
在手机中,也有许多需要保存的数据,如音频文件、视频、图片、通讯录、短信、游戏中的设置等数据。
Android作为一种手机上的操作系统,提供了以下几种数据存取方式:Preference(配置)、File(文件)、SQLite(数据库)、网络等。
另外,在Android中,各个应用程序组件之间是相互独立的,彼此的数据一般不能共享,为了实现数据的共享,Android提供Content Provider组件来实现应用程序之间的数据共享(最典型的共享就如通讯录)。
4.1 PreferencePreference提供了一种轻量级的数据存取方法,应用场合主要是数据比较少的配置信息。
它以“键-值”(是一个Map)对的方式将数据保存在一个XML配置文件中。
4.1.1 Preference简介使用Preference方式来存取数据,要用到SharedPreferences接口和SharedPreferences的一个内部接口SharedPreferences.Editor,这两个接口在android.content包中。
调用Context.getSharedPreferences( String name, int mode)方法可得到SharedPreferences接口,该方法的第一个参数是文件名称,第二个参数是操作模式。
操作模式有三种:MODE_PRIV ATE(私有)、MODE_WORLD_READABLE (可读)和MODE_WORLD_WRITEABLE(可写)。
SharedPreferences提供了获得数据的方法,如:getString、getInt等。
androidstudio数据库查询语句

androidstudio数据库查询语句Android Studio是一种集成开发环境(IDE),用于开发Android应用程序。
在Android应用程序开发中,数据库查询是非常重要的一环。
本文将一步一步地回答关于Android Studio数据库查询语句的问题。
第一步:什么是数据库查询语句?数据库查询语句是一种用于从数据库中检索数据的命令。
它可以选择性地检索特定的数据,并可以对数据进行排序、过滤和聚合等操作。
数据库查询语句是通过使用SQL(结构化查询语言)编写的。
第二步:如何在Android Studio中执行数据库查询语句?在Android Studio中,可以使用SQLite数据库进行数据存储和查询。
SQLite 是一种轻量级的数据库引擎,适用于Android应用程序开发。
首先,在Android Studio中创建数据库。
可以使用SQLiteOpenHelper类来创建数据库和表,并在onCreate()方法中执行所需的数据库创建和初始化操作。
javapublic class DatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "mydatabase.db";private static final int DATABASE_VERSION = 1;public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS mytable (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");}...}然后,在需要执行数据库查询语句的地方,获取一个可读的数据库实例,并使用rawQuery()方法执行查询语句。
基于Android系统的数据库开发和插件技术的应用开发

机Q Q 、微 信 、支 付 宝 A n d r o i d客 户端 等 ,它们 的 开 发 者 在 开 发 这 些 应 用 时 都 在使 用 着 不 同的 形 式 进行 插 件 式 开 发 。
2 数据 库链 接
数据 存储是 应用 开发 过程 中不可 避免 的问题 之一 。A n — d r o i d系 统 平 台对 于数 据 的 存 储 和 调 用 方 式 是 多 种 多 样 的 。就
YUAN Xi a n g - y i n g
( N a n j i n g F o r e s t P o l i c e C o l l e g e, Mo d e m E d u c a t i o n T e c h n o l o g y C e n t e r , N a n j i n g 2 1 0 0 4 6, C h i n a )
的 困 难 是 碎 块 化 问 题 。一 方 面 是 系 统 的 碎 块 化 , 从 A n d r o i d
进 行 通 信 。 利 用 服 务 器 强 大 的 数 据 处 理 能 力 ,将 数 据 需 求 发
送 到 We b S e r v i e e中 。 由 We b S e r v i c e与 数 据 库 连 接 ,获 取 数 据 之后 封装 成 X ML格 式 或 是 J S O N 格 式 等 数 据 包 ,再 发 送 给
在A n d r o i d平 台上 . 由于 A n d r o i d系统 的特 性 以及 A n d r o i d 系 统 运 行 设 备 的 性 能 特 性 ,A n d r o i d程 序 插 件 式 开 发 并 没 有 Wi n d o w s 系 统 平 台 那 么 方 便 。G o o g l e 公 司在 开 发 A n d r o i d系 统
如何进行可靠的Android数据库测试

如何进行可靠的Android数据库测试在进行可靠的Android数据库测试之前,我们首先需要了解数据库测试的重要性和目标。
数据库测试是指对Android应用程序中的数据库进行验证和验证,以确保它们的功能和性能符合预期。
一个可靠的数据库测试可以帮助我们发现并排除潜在的问题,确保应用程序在使用数据库时能够正常运行。
本文将介绍一些进行可靠的Android数据库测试的方法和技巧。
一、创建测试用例在进行数据库测试之前,我们首先需要创建测试用例。
测试用例是一组测试步骤和期望结果的规范,用于验证数据库的功能和性能。
测试用例应该尽可能地覆盖各种边界情况和异常情况,以确保数据库在各种条件下的稳定性和一致性。
测试用例可以包括以下方面的内容:1. 数据库创建和连接:测试数据库的创建过程和连接是否正常。
2. 数据库表的创建和删除:测试表的创建和删除是否正常。
3. 数据插入和查询:测试数据插入和查询是否正确。
4. 数据更新和删除:测试数据更新和删除是否正确。
5. 数据库事务的处理:测试数据库事务的处理是否正确。
6. 数据库性能测试:测试数据库在高负载和大数据量情况下的性能表现。
二、使用模拟数据在进行数据库测试时,我们可以使用模拟数据来模拟真实的数据场景。
模拟数据可以帮助我们在不对实际数据进行修改的情况下进行测试,减少对真实数据的影响。
模拟数据可以包括以下方面的内容:1. 创建模拟数据:根据数据库模式和需求,创建与实际数据相似的模拟数据。
2. 插入模拟数据:将模拟数据插入数据库中,模拟真实数据的情况。
3. 查询和验证模拟数据:使用模拟数据进行查询,验证查询结果是否符合预期。
三、使用断言进行验证在进行数据库测试时,我们可以使用断言来验证数据库的功能和性能是否符合预期。
断言是一种用于检查程序运行结果的方法,可以帮助我们判断程序是否按照预期的方式执行。
使用断言进行验证可以包括以下方面的内容:1. 查询结果的断言:在进行查询测试时,可以使用断言来验证查询结果是否与期望结果一致。
Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解

Android操作SQLite数据库(增、删、改、查、分页等)及ListView显⽰数据的⽅法详解本⽂实例讲述了Android操作SQLite数据库(增、删、改、查、分页等)及ListView显⽰数据的⽅法。
分享给⼤家供⼤家参考,具体如下:由于刚接触android开发,故此想把学到的基础知识记录⼀下,以备查询,故此写的⽐较啰嗦:步骤如下:⼀、介绍:此⽂主要是介绍怎么使⽤android⾃带的数据库SQLite,以及把后台的数据⽤ListView控件显⽰⼆、新建⼀个android⼯程——DBSQLiteOperate⼯程⽬录:三、清单列表AndroidManifest.xml的配置为:<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.example.dboperate"android:versionCode="1"android:versionName="1.0" ><uses-sdk android:minSdkVersion="8" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name" ><!--单元测试加这句--><uses-library android:name="android.test.runner" /><activityandroid:name=".DBSQLiteOperateActivity"android:label="@string/app_name" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity></application><instrumentation android:name="android.test.InstrumentationTestRunner"android:targetPackage="com.example.dboperate"android:label="Test for my app"/></manifest>四、main.xml配置清单:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><LinearLayout android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid:id="@+id/name"android:layout_width="100dip"android:layout_height="wrap_content"android:text="@string/name"android:gravity="center"/><TextViewandroid:id="@+id/phone"android:layout_width="100dip"android:layout_height="wrap_content"android:text="@string/phone"android:gravity="center"/><TextViewandroid:id="@+id/amount"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/amount"android:gravity="center"/></LinearLayout><ListViewandroid:id="@+id/listView"android:layout_width="fill_parent"android:layout_height="fill_parent" ></ListView></LinearLayout>五、item.xml配置清单:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="horizontal" ><TextViewandroid:id="@+id/name"android:layout_width="100dip"android:layout_height="wrap_content"android:text="@string/name"android:gravity="center"/><TextViewandroid:id="@+id/phone"android:layout_width="100dip"android:layout_height="wrap_content"android:text="@string/phone"android:gravity="center"/><TextViewandroid:id="@+id/amount"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="@string/amount"android:gravity="center"/></LinearLayout>六、string.xml配置清单:<?xml version="1.0" encoding="utf-8"?><resources><string name="hello">Hello World, DBSQLiteOperateActivity!</string><string name="app_name">ExampleDBSQLiteOperate8</string><string name="name">姓名</string><string name="phone">电话</string><string name="amount">存款</string></resources>七、DBSQLiteOperateActivity.java Activity类的源码:package com.example.dboperate;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import com.example.adapter.PersonAdapter;import com.example.domain.Person;import com.example.service.PersonService;import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.SimpleCursorAdapter;import android.widget.Toast;public class DBSQLiteOperateActivity extends Activity {ListView listView;PersonService personService;OnItemClickListener listViewListener;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);listViewListener = new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//得到listView控件ListView listView = (ListView)parent;//1、如果使⽤⾃定义适配器,返回的是Person对象//得到该条⽬数据// Person person = (Person)listView.getItemAtPosition(position);// //⼴播出去// Toast.makeText(getApplicationContext(), person.toString(), Toast.LENGTH_LONG).show(); //2、如果使⽤showList2()⽅法中的适配器时,则取得的值是不⼀样的,返回的是cursor// Cursor cursor = (Cursor)listView.getItemAtPosition(position);// int personid = cursor.getInt(cursor.getColumnIndex("_id"));// Toast.makeText(getApplicationContext(), personid+"", Toast.LENGTH_LONG).show();//3、如果使⽤showList()⽅法中的适配器时,则取得的值是不⼀样的,返回的是map@SuppressWarnings("unchecked")Map<String,Object> map = (Map)listView.getItemAtPosition(position);String name = map.get("name").toString();String personid = map.get("personid").toString();Toast.makeText(getApplicationContext(), personid +"-"+ name, Toast.LENGTH_LONG).show(); }};listView = (ListView) this.findViewById(R.id.listView);listView.setOnItemClickListener(listViewListener);personService = new PersonService(this);showList();}private void showList() {List<Person> persons = personService.getScrollData(0, 50);List<HashMap<String,Object>> data = new ArrayList<HashMap<String,Object>>();for(Person person : persons){HashMap<String,Object> item = new HashMap<String,Object>();item.put("name", person.getName());item.put("phone", person.getPhone());item.put("amount", person.getAmount());item.put("personid", person.getId());data.add(item);}SimpleAdapter adapter = new SimpleAdapter(this,data,yout.item, new String[]{"name","phone","amount"}, new int[]{,R.id.phone,R.id.amount});listView.setAdapter(adapter);}public void showList2(){Cursor cursor = personService.getCursorScrollData(0, 50);//该适配器要求返回的结果集cursor必须包含_id字段,所以需要对取得结果集进⾏处理SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,yout.item,cursor,new String[]{"name","phone","amount"}, new int[]{,R.id.phone,R.id.amount} ); listView.setAdapter(adapter);}/*** ⾃定义适配器*/public void showList3(){List<Person> persons = personService.getScrollData(0, 50);/*** 第⼀个参数:上下⽂context,第⼆个参数:要显⽰的数据,第三个参数:绑定的条⽬界⾯*/PersonAdapter adapter = new PersonAdapter(this, persons, yout.item);listView.setAdapter(adapter);}}⼋、person.java 实体类源码:package com.example.domain;public class Person {private Integer id;private String name;private String phone;private Integer amount;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) { = name;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}public Person(String name, String phone) { = name;this.phone = phone;}public Person(Integer id, String name, String phone,Integer amount) {super();this.id = id; = name;this.phone = phone;this.amount = amount;}public Person() {super();}public Integer getAmount() {return amount;}public void setAmount(Integer amount) {this.amount = amount;}@Overridepublic String toString() {return "Person [id=" + id + ", name=" + name + ", phone=" + phone+ ", amount=" + amount + "]";}}九、DBOperateHelper.java 业务类源码:package com.example.service;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class DBOperateHelper extends SQLiteOpenHelper {public DBOperateHelper(Context context) {//默认创建的数据库⽂件保存在<包名>/database///第⼀个参数是上下⽂,第⼆个参数是数据库名称,第三个是游标⼯⼚为null时使⽤数据库默认的游标⼯⼚,第四个是数据库版本号但是不能为0,⼀般⼤于0super(context, "smallpig", null, 4);}/*** 数据库每⼀次被创建时被调⽤*/@Overridepublic void onCreate(SQLiteDatabase sqldb) {sqldb.execSQL("create table person(personid integer primary key autoincrement,name varchar(20),phone varchar(12) null)");}/*** 每⼀次数据库版本号发⽣变动时触发此⽅法* ⽐如如果想往数据库中再插⼊⼀些表、字段或者其他信息时通过修改数据库版本号来触发此⽅法*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//db.execSQL("alter table person add phone varchar(12) null");\db.execSQL("alter table person add amount Integer null");}}⼗、PersonService.java 业务类源码:package com.example.service;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import com.example.domain.Person;public class PersonService {private DBOperateHelper dbOperateHelper;public PersonService(Context context) {this.dbOperateHelper = new DBOperateHelper(context);}/*** 保存记录* @param person*/public void save(Person person){//得到数据库实例,⾥⾯封装了数据库操作⽅法SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();//sqldb.execSQL("insert into person(name,phone) values('"+person.getName()+"','"+person.getPhone()+"')");//利⽤占位符可以避免注⼊,但是注意数组参与与占位符对应的字段要⼀⼀对应sqldb.execSQL("insert into person(name,phone,amount) values(?,?,?)",new Object[]{person.getName(),person.getPhone(),person.getAmount()});//关闭数据库sqldb.close();}/*** 删除记录* @param id*/public void delete(Integer id){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();sqldb.execSQL("delete from person where personid=?",new Object[]{id});sqldb.close();}/*** 更新记录* @param person*/public void update(Person person){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();sqldb.execSQL("update person set name=?,phone=?,amount=? where personid=?",new Object[]{person.getName(),person.getPhone(),person.getAmount(),person.getId()}); sqldb.close();}/*** 通过ID查询记录* @param id* @return*/public Person find(Integer id){/*** getWritableDatabase 与 getReadableDatabase 的区别:* getReadableDatabase会先返回getWritableDatabase(可写),如果调⽤getWritableDatabase失败* 则才会调⽤getReadableDatabase后续⽅法,使数据库只读* 当写⼊的数据超过数据库⼤⼩则调⽤getWritableDatabase会失败* 所以只读时则可以使⽤此⽅法,其它情况(只要不是超过数据库⼤⼩)也可以使⽤此⽅法*/SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();Cursor cursor = sqldb.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)});int personid;String name;String phone;int amount;Person person = null;if(cursor.moveToFirst()){personid = cursor.getInt(cursor.getColumnIndex("personid"));name = cursor.getString(cursor.getColumnIndex("name"));phone = cursor.getString(cursor.getColumnIndex("phone"));amount = cursor.getInt(cursor.getColumnIndex("amount"));person = new Person(personid,name,phone,amount);}cursor.close();return person;}/*** 返回指定长度记录,limit 3,5,适⽤于分页* @param offset 起始* @param maxResult 长度* @return*/public List<Person> getScrollData(int offset,int maxResult){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();Cursor cursor = sqldb.rawQuery("select * from person order by personid asc limit ?,?", new String[]{String.valueOf(offset),String.valueOf(maxResult)});int personid;String name;String phone;int amount;Person person = null;List<Person> persons = new ArrayList<Person>();while(cursor.moveToNext()){personid = cursor.getInt(cursor.getColumnIndex("personid"));name = cursor.getString(cursor.getColumnIndex("name"));phone = cursor.getString(cursor.getColumnIndex("phone"));amount = cursor.getInt(cursor.getColumnIndex("amount"));person = new Person(personid,name,phone,amount);persons.add(person);}cursor.close();return persons;}/*** 返回cursor* @param offset 起始* @param maxResult 长度* @return*/public Cursor getCursorScrollData(int offset,int maxResult){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();Cursor cursor = sqldb.rawQuery("select personid as _id,name,phone,amount from person order by personid asc limit ?,?", new String[]{String.valueOf(offset),String.valueOf(maxResult)}); return cursor;}/*** 返回总记录数* @return*/public long getCount(){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();Cursor cursor = sqldb.rawQuery("select count(*) from person", null);//该查询语句值返回⼀条语句cursor.moveToFirst();long result = cursor.getLong(0);cursor.close();return result;}public void payment(){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();sqldb.beginTransaction();//开启事务try{sqldb.execSQL("update person set amount = amount -10 where personid=1");sqldb.execSQL("update person set amount = amount + 10 where personid=2");sqldb.setTransactionSuccessful();//设置事务标志位true} finally {//结束事务:有两种情况:commit\rollback,事务提交或者回滚是由事务的标识决定的//事务为ture则提交,事务为flase则回滚,默认为falsesqldb.endTransaction();}}}⼗⼀、OtherPersonService.java 业务类源码:package com.example.service;import java.util.ArrayList;import java.util.List;import com.example.domain.Person;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class OtherPersonService {private DBOperateHelper dbOperateHelper;public OtherPersonService(Context context) {this.dbOperateHelper = new DBOperateHelper(context);}/*** 保存记录* @param person*/public void save(Person person){//得到数据库实例,⾥⾯封装了数据库操作⽅法SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();//sqldb.execSQL("insert into person(name,phone) values('"+person.getName()+"','"+person.getPhone()+"')");//利⽤占位符可以避免注⼊,但是注意数组参与与占位符对应的字段要⼀⼀对应//sqldb.execSQL("insert into person(name,phone) values(?,?)",new Object[]{person.getName(),person.getPhone()});ContentValues values = new ContentValues();values.put("name", person.getName());values.put("phone", person.getPhone());values.put("amount", person.getAmount());//第⼀个参数是表名,第三个为字段值集合,第⼆个参数是空值字段,当第三个字段值集合为空时,系统会⾃动插⼊⼀条第⼆个参数为空的sql语句//否则当第三个参数为空时,如果第⼆个参数也为空,那么插⼊表就会找不到插⼊的字段信息,会报错sqldb.insert("person", "name", values );//关闭数据库sqldb.close();}/*** 删除记录* @param id*/public void delete(Integer id){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();//sqldb.execSQL("delete from person where personid=?",new Object[]{id});//第⼀个参数是表名,第⼆个是where后⾯的条件⽤占位符表⽰,第三个对应占位符为参数值sqldb.delete("person", "personid=?", new String[]{Integer.toString(id)});sqldb.close();}/*** 更新记录* @param person*/public void update(Person person){SQLiteDatabase sqldb = dbOperateHelper.getWritableDatabase();//sqldb.execSQL("update person set name=?,phone=? where personid=?",new Object[]{person.getName(),person.getPhone(),person.getId()});//第⼀个参数为表名,第⼆个是⼀个更新值集合,采⽤键值对的形式,每个更新的字段对应更新值//第三个参数是where后⾯条件字段⽤占位符标识,第四个参数是对应where占位符的值ContentValues values = new ContentValues();values.put("name", person.getName());values.put("phone", person.getPhone());values.put("amount", person.getAmount());sqldb.update("person", values , "personid=?", new String[]{person.getId().toString()});sqldb.close();}/*** 通过ID查询记录* @param id* @return*/public Person find(Integer id){/*** getWritableDatabase 与 getReadableDatabase 的区别:* getReadableDatabase会先返回getWritableDatabase(可写),如果调⽤getWritableDatabase失败* 则才会调⽤getReadableDatabase后续⽅法,使数据库只读* 当写⼊的数据超过数据库⼤⼩则调⽤getWritableDatabase会失败* 所以只读时则可以使⽤此⽅法,其它情况(只要不是超过数据库⼤⼩)也可以使⽤此⽅法*/SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();//Cursor cursor = sqldb.rawQuery("select * from person where personid=?", new String[]{String.valueOf(id)});//第⼀个参数是表名;第⼆个参数是查询显⽰的字段,null时默认查询显⽰所有字段;//第三个参数是where查询条件占位符;第四个是占位符对应的值;//第五个参数是group by条件;第六个是having条件;第七个是order by条件Cursor cursor = sqldb.query("person", null, "personid=?", new String[]{id.toString()}, null, null, null);int personid;String name;String phone;int amount;Person person = null;if(cursor.moveToFirst()){personid = cursor.getInt(cursor.getColumnIndex("personid"));name = cursor.getString(cursor.getColumnIndex("name"));phone = cursor.getString(cursor.getColumnIndex("phone"));amount = cursor.getInt(cursor.getColumnIndex("amount"));person = new Person(personid,name,phone,amount);}cursor.close();return person;}/*** 返回指定长度记录,limit 3,5,适⽤于分页* @param offset 起始* @param maxResult 长度* @return*/public List<Person> getScrollData(int offset,int maxResult){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();//Cursor cursor = sqldb.rawQuery("select * from person order by personid asc limit ?,?", new String[]{String.valueOf(offset),String.valueOf(maxResult)}); //第⼀个参数是表名;第⼆个参数是查询显⽰的字段,null时默认查询显⽰所有字段;//第三个参数是where查询条件占位符;第四个是占位符对应的值;//第五个参数是group by条件;第六个是having条件;第七个是order by条件//第⼋个参数是limit ?,? 条件Cursor cursor = sqldb.query("person", null, null, null, null, null, "personid",offset+","+maxResult); int personid;String name;String phone;int amount;Person person = null;List<Person> persons = new ArrayList<Person>();while(cursor.moveToNext()){personid = cursor.getInt(cursor.getColumnIndex("personid"));name = cursor.getString(cursor.getColumnIndex("name"));phone = cursor.getString(cursor.getColumnIndex("phone"));amount = cursor.getInt(cursor.getColumnIndex("amount"));person = new Person(personid,name,phone,amount);persons.add(person);}cursor.close();return persons;}/*** 返回总记录数* @return*/public long getCount(){SQLiteDatabase sqldb = dbOperateHelper.getReadableDatabase();//Cursor cursor = sqldb.rawQuery("select count(*) from person", null);//第⼀个参数是表名;第⼆个参数是查询显⽰的字段,null时默认查询显⽰所有字段;//第三个参数是where查询条件占位符;第四个是占位符对应的值;//第五个参数是group by条件;第六个是having条件;第七个是order by条件Cursor cursor = sqldb.query("person", new String[]{"count(*)"}, null, null, null, null, null);//该查询语句值返回⼀条语句cursor.moveToFirst();long result = cursor.getLong(0);cursor.close();return result;}}⼗⼆、PersonServiceTest.java 单元测试类源码:package com.example.test;import java.util.List;import com.example.domain.Person;import com.example.service.DBOperateHelper;import com.example.service.PersonService;import android.test.AndroidTestCase;import android.util.Log;public class PersonServiceTest extends AndroidTestCase {public void testCreateDB() throws Exception{DBOperateHelper dbHelper = new DBOperateHelper(getContext());dbHelper.getWritableDatabase();}public void testSave() throws Exception{PersonService ps = new PersonService(getContext());for(int i=1;i<=100;i++){Person person = new Person();person.setName("我是"+i);person.setPhone(String.valueOf(Long.parseLong("188********")+i));ps.save(person);Log.i("PersonService",person.toString());}}public void testDelete() throws Exception{PersonService ps = new PersonService(getContext());ps.delete(10);}public void testUpdate() throws Exception{PersonService ps = new PersonService(getContext());ps.update(new Person(1,"xiaopang","188********",0));}public void testFind() throws Exception{PersonService ps = new PersonService(getContext());Person person = ps.find(1);Log.i("PersonService", person.toString());}public void testGetScrollData() throws Exception{PersonService ps = new PersonService(getContext());List<Person> persons = ps.getScrollData(3, 5);for(Person person:persons){Log.i("PersonService",person.toString());}}public void testGetCount() throws Exception{PersonService ps = new PersonService(getContext());Long count = ps.getCount();Log.i("PersonService",count.toString());}public void testUpdateAmount() throws Exception{PersonService ps = new PersonService(getContext());Person person1 = ps.find(1);Person person2 = ps.find(2);person1.setAmount(100);person2.setAmount(100);ps.update(person1);ps.update(person2);}public void testPayment() throws Exception{PersonService ps = new PersonService(getContext());ps.payment();}}⼗三、OtherPersonServiceTest 单元测试类源码:package com.example.test;import java.util.List;import com.example.domain.Person;import com.example.service.DBOperateHelper;import com.example.service.OtherPersonService;import android.test.AndroidTestCase;import android.util.Log;public class OtherPersonServiceTest extends AndroidTestCase {public void testCreateDB() throws Exception{DBOperateHelper dbHelper = new DBOperateHelper(getContext());dbHelper.getWritableDatabase();}public void testSave() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());for(int i=1;i<=100;i++){Person person = new Person();person.setName("我是"+i);person.setPhone(String.valueOf(Long.parseLong("188********")+i));ps.save(person);Log.i("PersonService",person.toString());}}public void testDelete() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());ps.delete(10);}public void testUpdate() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());ps.update(new Person(1,"xiaopang","188********",0));}public void testFind() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());Person person = ps.find(1);Log.i("PersonService", person.toString());}public void testGetScrollData() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());List<Person> persons = ps.getScrollData(3, 5);for(Person person:persons){Log.i("PersonService",person.toString());}}public void testGetCount() throws Exception{OtherPersonService ps = new OtherPersonService(getContext());Long count = ps.getCount();Log.i("PersonService",count.toString());}}⼗四、注意事项以及相关知识点:1、掌握SQLite数据库如何创建数据库、建⽴表、维护字段等操作继承SQLiteOpenHelper类,构造函数调⽤⽗类构造函数创建数据库,利⽤onCreate创建表,利⽤onUpgrade更新表字段信息2、掌握SQLite数据库如何增、删、改、查以及分页取得SQLiteDatabase的实例,然后调⽤该实例的⽅法可以完成上述操作SQLiteDataBase提供两种操作上述功能的⽅式:⼀是直接调⽤execSQL书写sql语句,另⼀种是通过insert、update、delete、query等⽅法来传值来拼接sql,前⼀种适合熟练掌握sql 语句的3、对需要数据同步的处理请添加事务处理,熟悉事务的处理⽅式4、了解各个⽅法参数的意义以及传值5、掌握ListView显⽰后台数据的使⽤⽅法SimpleAdapter、SimpleCursorAdapter以及⾃定义适配器的使⽤,以及OnItemClickListener取值时各个适配器返回值的区别以及取值⽅法6、多学、多记、多练、多思,加油!更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Android程序设计有所帮助。
Android五种数据存储方式

Android五种数据存储⽅式android 五种数据存储:SharePreferences、SQLite、Contert Provider、File、⽹络存储Android系统提供了四种存储数据⽅式。
分别为:SharePreference、SQLite、Content Provider和File。
但由于Android系统中,数据基本是私有的,都是存放于”data/data”程序包名⽬录下,所以要实现数据共享,正确⽅式是使⽤Content ProviderSQLite:SQLite是⼀个轻量级的数据库,⽀持基本的SQL语法,是常被采⽤的⼀种数据存储⽅式。
Android为此数据库提供了⼀个名为SQLiteDatabase的类,封装了⼀些操作数据库的apiSharedPreference:除SQLite数据库外,另⼀种常⽤的数据存储⽅式,其本质就是⼀个xml⽂件,常⽤于存储较简单的参数设置。
File:即常说的⽂件(I/O)存储⽅法,常⽤语存储⼤数量的数据,但是缺点是更新数据将是⼀件困难的事情。
ContentProvider: Android系统中能实现所有应⽤程序共享的⼀种数据存储⽅式,由于数据通常在各应⽤间的是互相私密的,所以此存储⽅式较少使⽤,但是其⼜是必不可少的⼀种存储⽅式。
例如⾳频,视频,图⽚和通讯录,⼀般都可以采⽤此种⽅式进⾏存储。
每个Content Provider都会对外提供⼀个公共的URI(包装成Uri对象),如果应⽤程序有数据需要共享时,就需要使⽤Content Provider为这些数据定义⼀个URI,然后其他的应⽤程序就通过Content Provider传⼊这个URI来对数据进⾏操作。
URI由3个部分组成:"content://"、数据的路径、标识ID(可选)。
1)SQLite数据存储======================================================================SQLite是⼀种转为嵌⼊式设备设计的轻型数据库,其只有五种数据类型,分别为:NULL:空值INTEGER:整数REAL:浮点数TEXT:字符串BLOB:⼤数据在SQLite中,并没有专门设计BOOLEAN和DATE类型,因为BOOLEAN型可以⽤INTEGER的0和1代替true和false,⽽DATE类型则可以拥有特定格式的TEXT、REAL和INTEGER的值来代替显⽰,为了能⽅便的操作DATE类型,SQLite提供了⼀组函数,在Android系统中提供了anroid.database.sqlite包,⽤于进⾏SQLite数据库的增,删,改,查⼯作,其主要⽅法如下: beginTransaction(): 开始⼀个事务。
AndroidSQLite数据库增删改查操作

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(值列表)。
Android数据库 之 SQLite数据库

Android数据库之 SQLite数据库android数据库之sqlite数据库delphixe5教程-firedac下的sqlite使用-前言介绍本文章了解了firedac下的sqlite采用,转回至万一老师的博客.delphixe5并入了firedac,第一印象非常好,恐怕dbexpress等等都要靠边站了.使我最高兴地就是firedac对sqlite的积极支持!杰出的sqlite早就存有很多delphi的外包装有静态引用obj的,有动态链接dll的,还有把dll嵌入资源文件的,甚至还有重写的(刚刚见过一套用c#重写的源码).delphi官方首次导入sqlite,必须就是在xe3(提供更多了system.sqlite单元),这似的只是为了积极支持dbx,也须要sqlite.dll积极支持.现在好了,有了firedac,有了firedac对sqlite更完善的支持(它没有使用system.sqlite.pas),特别须要表明的就是,在windwos平台下预设采用了sqlite3_x86.obj或sqlite3_x64.obj(firedac.phys.sqlitecli.pas),而非dll,再加之sqlite本来就不须要其他部署,太便利了.从此,不管是写本地程序、移动程序(sqlite是andriod的系统数据库)、网络程序我都将使用sqlite,恐怕在须要内存表中、ini文件、甚至就是定义某种文件格式时,我都会想起它.所以,一定必须把它研习精学皱!估计学完它至少会记下20篇博客,如果你也想和我一起学习,快安装xe6吧(xe5我没装过,lsuper搞的embarcadero.delphi.xe6.lite.v9.x应该更方便安装,这里一并谢过!).期望尽快修完这个,接下来还要学学intraweb(它必须就是明朗了)和移动研发,说道至移动研发向大家求救下\升级andriod系统的方法\我几年前出售的三星galaxy小平板手机(港行),系统就是andriod2.1,刚好够不着;谁搬过,拜托教导我之下;如果存有不升级也能够用作测试的方法则更好.安装xe6后,先用firedacexplorer浏览下官方提供的fddemo.sdb吧(实际路径:c:\\users\\public\\documents\\embarcadero\\studio\\14.0\\samples\\data\\fdd emo.sdb):delphixe5教程-firedac下的sqlite采用-第一个例子介绍本文章了解了firedac下的sqlite采用-第一个例子,转回至万一老师的博客.为了方便测试,我把官方提供的c:\\users\\public\\documents\\embarcadero\\studio\\14.0\\samples\\data\\fddemo .sdb激活了一份至c:\\temp\\fddemo.sdb.{新建一个vclformsapplication,然后添加如下控件(建议按ctrl+.后用键盘输入添加):}tfdphyssqlitedriverl动自动连接;不同数据库各对应一个:tfdphys****driverlinktfdguixwaitcursor//用于自动管理gui程序的在console和fmx下也都有类似对应的东西tfdconnection//数据连接tfdquerytdatasource//数据源tdbgrid//数据显示//usesfiredac.phys.sqlite之后,tfdphyssqlitedriverlink//usesfiredac.vclui.wait之后,可不用添加tfdguixwaitcursor{简单几行代码fddemo.sdb中的orders表中的数据}proceduretform1.formcreate(sender:tobject);beginfdconnection1.drivername:='sqlite';fdconnection1.params.add('database=c:\\temp\\fddemo.sdb');fdquery1.connection: =fdconnection1;datasource1.dataset:=fdquery1;dbgrid1.datasource:=datasource1;fdquery1.sql.text:='select*fromorders';//sqlite非常好地支持了sql92标准,目前被dbgrid1.align:=alclient;end;效果图:{稍稍变通一下代码}proceduretform1.formcreate(sender:tobject);begin//fdconnection1.connectionstring:='driverid=sqlite;database=c:\\temp\\fddemo.s db';//可以替代下面两行fdconnection1.params.add('driverid=sqlite');//同fdconnection1.drivername:='sqlite';fdconnection1.params.add('database=c:\\temp \\fddemo.sdb');fdquery1.connection:=fdconnection1;datasource1.dataset:=fdquery 1;dbgrid1.datasource:=datasource1;fdquery1.sql.text:='select*fromorders';fdconnection1.connected:=true;fdquery1. active:=true;dbgrid1.align:=alclient;end;{再变通一下}proceduretform1.formcreate(sender:tobject);beginfdquery1.connection:=fdconnection1;datasource1.dataset:=fdquery1;dbgrid1.datas ource:=datasource1;fdconnection1.open('driverid=sqlite;database=c:\\temp\\fddemo.sdb');fdquery1.o pen('select*fromorders');dbgrid1.align:=alclient;end;delphixe5教程-firedac下的sqlite采用-以获取数据库的基本信息介绍本文章了解了firedac下的sqlite采用-以获取数据库的基本信息,转回至万一老师的博客。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一:数据库:SQLite二:常用数据库:MySQL(瑞典的MYSQL AB公司创建后来被Oricle收购。
小型数据库小型企业免费的)Oracle,(美国的甲骨文公司创建)大型的数据库(开机速度会慢占用内存大)收费的)SQLite:(嵌入式类型的数据库)将整个的数据库嵌入到Android中或者嵌入到设备中)三:其他数据存储方式:SharePreferences:共享参数存储File:文件存储NetWork:网络存储ContentProVider:内容提供者存储四:Android数据存储选择SQLite数据库五:SQLite数据库简介1,SQLite是一种轻型的数据库,他的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用2,占用资源低3,第一个Alpha版本诞生于2000年5月4,最新版本:SQLite35,主要通信协议是在变成语言内直接API调用整个数据库(定义,表,索引和数据本身)都存储在一个单一的文件中六:SQLite特性:1,SQLite零配置,无需安装和管理配置2,存储在单一的磁盘文件中的一个完整数据库3,比一些流行的数据库在大部分普通数据库操作要快4,简单轻松的APISQLiteDateBase,SQLiteOpenHelper5,支持多种语言开发C,PHP ,Perl,JA V a,C#,Python七:SQLite数据类型:一般数据库使用的是静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断:SQLite具有五种数据类型,1:NULL:空值2:INTEGER:带符号的整形,具有取决有存入数字的范围大小,3:REAL:浮点数字,存储为8-byte IEEE、浮点数4:TEXT:字符串文本5:BLOB:二进制对象。
八:创建方式:1:命令行创建这个命令行创建方式不用导表直接创建进工程的date文件中。
(1):打开运行窗口,输入D:(因为安卓相关工具在D盘)就是切换到D盘(2):输入cd 接着复制adb所在的目录到命令行回车进入该目录(3):输入adb进入adb中并且输入adb shell进入linux平台(4):输入cd data回车进入data文件夹(5):输入cd data回车进入data的data文件中(6):输入cd com.it.mysqlite1回车进入该工程的文件夹中。
进入之后就可以创建数据库文件了(7):接下来输入sqlite3 test1.db(8):.database生成表2:调用API代码创建1:命令行创建:1,创建表:creat table table1(field1 类型,field2类型)备注:table1的意思是创建的表名,参数field1是第一列的意思,field2是第二列的意思,如果还想再创建第三列那就在加一个逗号,继续创建就可以。
类型的意思就是列的类型。
在SQlite中用Text表示字符串,用Integer表示int型。
2,插入数据:insert into table1(field1,field2) values(value1,value2)3,删除数据:delete from table1;删除所有,delete where(id= =1)4,更新:update tablel set field1=value1; 更新table1表中的field1列的值为value1;5,查找:select *from table1查询所有。
Select *from user where id=1;Select username from user wher id=1;一:linux命令1,命令格式:2,adb shell(进入linux 系统shell命令)adb(Android,debug,bridge)安卓调试桥3,cd[drrName]cd的作用就是切换目录的中间桥梁,括号内就是文件所在目录的路径。
4,pwd 查看当前所在目录5,ls 打印当前的目录清单。
二:SQLite命令1,SQLite3 test.db;创建数据库文件2,.help:帮助命令,可以查看所有命令3,.tables:查看已经创建的表格4,.schema表名:查看表结构5,.database.查看已经创建的数据库6,.exit/.quit:退出九:代码方式操作数据库SQLiteDataBase SQLiteOpenHelper1:SQLite支持的数据类型Null、空值INTEGER 有符号整型数REAL 实型值FLOAT 单精度浮点型值DOUBLE 双精度浮点型值NUMERIC 带固定精度和小数位值数据类型TEXT 文本字符串V ARCHAR 可变长度的字符数据类型NV ARCHAR 可变长度的字符数据类型使用Unicode编码BOOLEAN 布尔类型DATATIME 日期时间类型BLOB 大对象类型2:SQLiteDatabase代表一个数据库(实质就是一个数据库文件在data文件中)SQLiteDatabase用于管理,操作数据库的(1)SQLiteDatabase、实例化构造方法SQLiteDatabase openOrCreateDatabase(String name ,int mode,SQLiteDatebase.CursorFactory factory)参数含义:name 数据库名字,mode操作模式,factory:操作工厂类(2)方法:execSQL(String sql):用于执行SQL语句(3)方法close():用于关闭数据库代码SQLiteDatabase database;database=this.openOrCreateDatabase("user.db", Context.MODE_PRIVATE, null);String creatTableSQL="create table user(_id integer,name text);";database.execSQL(creatTableSQL);String insert="insert into user(_id,name) values(1,'何倩')";(4)database.execSQL(insert);3:数据库的帮助类:SQLiteOpenHelper可用于管理数据库的操作与更新方法:1:oncreate(SQLiteDatabase db);数据库创建的时候调用2:onUpgrade(SQLiteDatabase db,int oldVersion,int newV ersion)当数据库版本更新的时候调用3:getReadableDatabase()返回值是SQLiteDatebase,意思是获取一个可读的数据库4:getWritableDatabase()返回值一样意思是获取一个可写的数据库十:重点内容:数据库操作在MVC设计模式的实现M:modelV:ViewC:controll代码:MySQLiteOpenHelper/*** 该类的作用就是创建一个数据库sql.db,在数据库中创建了一个表table01* @author别乱动哈!!!!!!!**/public class MySQLiteOpenHelper extends SQLiteOpenHelper{/**一:* 该方法执行完成之后就创建了一个名字为sql.db的数据库文件* @param context*/public MySQLiteOpenHelper(Context context) {super(context, "sql.db", null, 1);}/*** 该方法在数据库创建完成之后就会执行里面的参数就是通过构造方法实例化之后获得那个数据库对象*/public void onCreate(SQLiteDatabase db) {String SQLCreateTable="create table table01(id integer primary key autoincrement,name text);";db.execSQL(SQLCreateTable);}/*** 该方法在数据库版本号更新的时候执行*/public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }}代码:SQLiteMannager/*** 该类的作用就是对数据库进行操作,包括添加数据,查询数据,更新数据(修改数据)删除数据* @author别乱动哈!!!!!!!**/public class SQLiteMannager {MySQLiteOpenHelper helper;//获取数据库的对象/**一:* 构造方法的作用就是获取一个数据库的对象* @param context*/public SQLiteMannager(Context context){helper=new MySQLiteOpenHelper(context);}/**二:* 添加数据,*/public void addSQliteData(User user){SQLiteDatabase sqLiteDatabase=helper.getWritableDatabase();String SQLinsert="insert into table01(id,name) values (?,?);";sqLiteDatabase.execSQL(SQLinsert, newString[]{user.getId()+"",user.getName()});}/**三:* 查询数据*/public List<User> findAllSQLitedata(){List<User> list=new ArrayList<User>();User user;SQLiteDatabase sqLiteDatabase=helper.getReadableDatabase();String sqlSelect="select*from table01";Cursor cursor=sqLiteDatabase.rawQuery(sqlSelect, null);while(cursor.moveToNext()){user=new User();int id=cursor.getInt(cursor.getColumnIndex("id"));String name=cursor.getString(cursor.getColumnIndex("name"));user.setId(id);user.setName(name);list.add(user);}return list;}/*** 更新数据(修改数据)*/public void upDataSQLite(User user){//获取一个可写的数据库SQLiteDatabase sqLiteDatabase=helper.getWritableDatabase();String updatSQL="update table01 set name=? where id=?";sqLiteDatabase.execSQL(updatSQL, newString[]{user.getName(),user.getId()+""});}/*** 删除数据*/public void deleteDataSQlite(int id){SQLiteDatabase sqLiteDatabase=helper.getWritableDatabase();String updatSQL="delete from table01 where id=?";sqLiteDatabase.execSQL(updatSQL, new Integer[]{id});}}代码:Mytestpublic class Mytest extends AndroidTestCase{SQLiteMannager mannager;//数据库管理类在这个类中有很多的对数据库进行操作的方法protected void setUp() throws Exception {super.setUp();mannager=new SQLiteMannager(this.getContext());}/*** 测试添加数据*/public void testAddSQliteData(){User user01=new User();user01.setId(5);user01.setName("张三");User user02=new User();user02.setId(2);user02.setName("李四");User user03=new User();user03.setId(3);user03.setName("王五");User user04=new User();user04.setId(4);user04.setName("小六");mannager.addSQliteData(user01);mannager.addSQliteData(user02);mannager.addSQliteData(user03);mannager.addSQliteData(user04);}/*** 测试查询数据*/public void testFindAllSQLitedata(){List<User> list=mannager.findAllSQLitedata();for(int i=0;i<list.size();i++){System.out.println("查询到的数据是:"+list.get(i).getId()+"-----\n"+list.get(i).getName());}}/*** 测试修改数据库*/public void testUpDataSQLite(){User user=new User();user.setId(1);user.setName("新的名字");mannager.upDataSQLite(user);}/*** 测试删除数据库*/public void testDeleteDataSQlite(){mannager.deleteDataSQlite(1);}}以上的内容全部是基于SQL语句对数据库进行的操作十一:基于对象的对数据库的操作。