AndrOiddata数据库

合集下载

第4章 Android中的数据存储

第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数据库查询语句

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系统的数据库开发和插件技术的应用开发

基于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应用程序中的数据库进行验证和验证,以确保它们的功能和性能符合预期。

一个可靠的数据库测试可以帮助我们发现并排除潜在的问题,确保应用程序在使用数据库时能够正常运行。

本文将介绍一些进行可靠的Android数据库测试的方法和技巧。

一、创建测试用例在进行数据库测试之前,我们首先需要创建测试用例。

测试用例是一组测试步骤和期望结果的规范,用于验证数据库的功能和性能。

测试用例应该尽可能地覆盖各种边界情况和异常情况,以确保数据库在各种条件下的稳定性和一致性。

测试用例可以包括以下方面的内容:1. 数据库创建和连接:测试数据库的创建过程和连接是否正常。

2. 数据库表的创建和删除:测试表的创建和删除是否正常。

3. 数据插入和查询:测试数据插入和查询是否正确。

4. 数据更新和删除:测试数据更新和删除是否正确。

5. 数据库事务的处理:测试数据库事务的处理是否正确。

6. 数据库性能测试:测试数据库在高负载和大数据量情况下的性能表现。

二、使用模拟数据在进行数据库测试时,我们可以使用模拟数据来模拟真实的数据场景。

模拟数据可以帮助我们在不对实际数据进行修改的情况下进行测试,减少对真实数据的影响。

模拟数据可以包括以下方面的内容:1. 创建模拟数据:根据数据库模式和需求,创建与实际数据相似的模拟数据。

2. 插入模拟数据:将模拟数据插入数据库中,模拟真实数据的情况。

3. 查询和验证模拟数据:使用模拟数据进行查询,验证查询结果是否符合预期。

三、使用断言进行验证在进行数据库测试时,我们可以使用断言来验证数据库的功能和性能是否符合预期。

断言是一种用于检查程序运行结果的方法,可以帮助我们判断程序是否按照预期的方式执行。

使用断言进行验证可以包括以下方面的内容:1. 查询结果的断言:在进行查询测试时,可以使用断言来验证查询结果是否与期望结果一致。

Android操作SQLite数据库(增、删、改、查、分页等)及ListView显示数据的方法详解

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五种数据存储⽅式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数据库增删改查操作

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数据库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采用-以获取数据库的基本信息,转回至万一老师的博客。

android联系人数据库介绍

android联系人数据库介绍

<联系人>联系人数据库介绍拟制: Prepared by 吕欣阳日期:Date2015-11-26审核: Reviewed by 日期:Dateyyyy-mm-dd审核: Reviewed by 日期:Dateyyyy-mm-dd批准: Granted by日期:Dateyyyy-mm-dd青岛海信移动技术股份有限公司版权所有侵权必究修订记录Revision record目录联系人数据库介绍 (1)1 关键类 (1)1.1 ContactAggregator.java (1)1.2 MoreDatabaseUtils.java (1)1.3 ContactsDumpActivity.java (1)1.4 CallLogProvider.java (2)1.5 ContactLocaleUtils.java (2)1.6 ContactsDatabaseHelper.java (3)1.7 ContactsProvider2.java (4)1.8 DataRowHandler.java (5)1.9 FastScrollingIndexCache.java (5)1.10 GlobalSearchSupport.java (6)1.11 HanziToPinyin.java (6)1.12 NameSplitter.java (6)1.13 PhotoProcessor.java (6)1.14 SearchIndexManager.java (6)2 数据库主要表介绍 (7)2.1 Accounts表 (7)2.2 Contacts表 (7)2.3 data表 (7)2.4 groups表 (8)2.5 mimetypes表 (8)2.6 name_lookup表 (8)2.7 phone_lookup表 (8)2.8 raw_contacts表 (9)2.9 search_index_content表 (9)3 phone_lookup查询介绍 (10)4 私密联系人实现 (10)5 sqlite3介绍 (11)联系人数据库介绍1 关键类1.1 ContactAggregator.java合并、拆分类,两个联系人可以合并为一个,合并后详情显示全部信息,编辑界面可以看到合并的多个记录;合并后记录可以拆分为合并之前的多个记录对于contacts表的操作也在这个类中,contacts表中数据的生成在computeAggregateData()函数中。

Android数据库ORMlite框架翻译

Android数据库ORMlite框架翻译

Android数据库ORMlite框架翻译前言Android数据库ORMlite框架翻译。

这章的内容的确不少,所以这次仍然没有翻译完。

2.7 表和Schema创建有几个ORMLite提供的工具,可以帮助你为存入数据库的类创建表和schema。

2.7.1 TableUtils类TableUtils类提供了一些静态方法用以辅助创建和删除表,同样也提供了schema申明。

(下面例举出静态方法名,详细说明参见官网)静态方法原型createTable(ConnectionSource, Class)createTableIfNotExists(ConnectionSource, Class)createTable(ConnectionSource, DatabaseTableConfig)createTableIfNotExists(ConnectionSource, DatabaseTableConfig)dropTable(ConnectionSource, Class, boolean ignoreErrors)dropTable(ConnectionSource, DatabaseTableConfig, boolean ignoreErrors) getCreateTableStatements(ConnectionSource, Class)getCreateTableStatements(ConnectionSource, DatabaseTableConfig)clearTable(ConnectionSource, Class)clearTable(ConnectionSource, DatabaseTableConfi2.7.2 TableCreator类TableCreator这个类虽然是为使用Spring框架设计的,但是在其他的配置方面是很有用的。

它配置ConnectionSource和被程序使用的DAO列表。

android dao 数据库简单用法

android dao 数据库简单用法

android dao 数据库简单用法Android DAO 数据库简单用法在Android开发中,使用数据库是非常常见的操作之一。

数据库的使用可以帮助我们持久化数据,并允许我们在应用程序中进行数据的查询、插入、更新和删除操作。

在本文中,我们将重点讨论Android中的DAO模式,并介绍如何在Android应用程序中实现简单的数据库操作。

一、什么是DAO模式?DAO(Data Access Object)模式是一种设计模式,它的主要目的是将数据访问逻辑与业务逻辑分离。

在Android中,DAO模式通常用于封装数据库操作,将数据库的增删改查等操作封装在DAO类中,使业务逻辑模块与数据访问模块解耦,提高代码的可维护性和可测试性。

二、创建数据库首先,我们需要创建一个数据库。

Android提供了SQLite数据库,可以用于存储应用程序的数据。

要创建一个数据库,我们需要继承SQLiteOpenHelper类,并实现onCreate()和onUpgrade()方法。

1. 创建一个名为DatabaseHelper的类,继承自SQLiteOpenHelper。

javapublic class DatabaseHelper extends SQLiteOpenHelper { 数据库名和版本号private static final String DATABASE_NAME = "my_database";private static final int DATABASE_VERSION = 1;表名和列名private static final String TABLE_NAME = "my_table";private static final String COLUMN_ID = "id";private static final String COLUMN_NAME = "name";...public DatabaseHelper(Context context) {super(context, DATABASE_NAME, null,DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {创建表的SQL语句String CREATE_TABLE_SQL = "CREATE TABLE " + TABLE_NAME + " (" +COLUMN_ID + " INTEGER PRIMARY KEYAUTOINCREMENT, " +COLUMN_NAME + " TEXT)";执行创建表的操作db.execSQL(CREATE_TABLE_SQL);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {备份数据并删除原表String BACKUP_TABLE_SQL = "ALTER TABLE " +TABLE_NAME + " RENAME TO temp_"+ TABLE_NAME;db.execSQL(BACKUP_TABLE_SQL);db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);创建新表onCreate(db);将备份数据恢复到新表String RESTORE_TABLE_SQL = "INSERT INTO " + TABLE_NAME + " SELECT * FROM temp_"+ TABLE_NAME;db.execSQL(RESTORE_TABLE_SQL);删除备份表db.execSQL("DROP TABLE IF EXISTS temp_" +TABLE_NAME);}}2. 在需要使用数据库的地方,创建DatabaseHelper对象,并获取可写数据库。

详解Android数据存储之SQLCipher数据库加密

详解Android数据存储之SQLCipher数据库加密

详解Android数据存储之SQLCipher数据库加密前⾔:最近研究了Android Sqlite数据库以及ContentProvider程序间数据共享,我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database⽬录下,对于已经ROOT的⼿机来说的没有任何安全性可以,⼀旦被利⽤将会导致数据库数据的泄漏,所以我们该如何避免这种事情的发⽣呢?我们尝试这对数据库进⾏加密。

选择加密⽅案:1.)第⼀种⽅案我们可以对数据的数据库名,表名,列名就⾏md5,对存储的数据进⾏加密,例如进⾏aes加密(Android数据加密之Aes加密),查询的时候再对数据进⾏解密,这种⽅式不能说不好,但是使⽤起来可以想象⼀下其带来的⿇烦程度。

2.)第⼆种⽅案采⽤第三⽅加密开源库,查找了很多种Android 数据库加密⽅案,最终选定SQLCipher这个开源框架,接下来看下SqlCipher 如何使⽤。

SQLCipher简介:SQLCipher是⼀个在SQLite基础之上进⾏扩展的开源数据库,SQLCipher具有占地⾯积⼩、性能因此它⾮常适合嵌⼊式应⽤的数据库保护,⾮常适合于移动开发。

优势:加密性能⾼、开销⼩,只要5-15%的开销⽤于加密完全做到数据库100%加密采⽤良好的加密⽅式(CBC加密模式)使⽤⽅便,做到应⽤级别加密采⽤OpenSSL加密库提供的算法SQLCipher使⽤⽅式:1.)在build.gradle⽂中添加如下代码,当前使⽤的是最新版本3.4.0dependencies {compile 'net.zetetic:android-database-sqlcipher:3.4.0'}2.)创建⼀个SQLiteOpenHelper 注意接下来所以有关Sqlite相关类全部引⽤net.sqlcipher.database的类import android.content.Context;import android.util.Log;import net.sqlcipher.SQLException;import net.sqlcipher.database.SQLiteDatabase;import net.sqlcipher.database.SQLiteOpenHelper;public class DBCipherHelper extends SQLiteOpenHelper {private static final String TAG = "DatabaseHelper";private static final String DB_NAME = "test_cipher_db";//数据库名字public static final String DB_PWD="whoislcj";//数据库密码public static String TABLE_NAME = "person";// 表名public static String FIELD_ID = "id";// 列名public static String FIELD_NAME= "name";// 列名private static final int DB_VERSION = 1; // 数据库版本public DBCipherHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {super(context, name, factory, version);//不可忽略的进⾏so库加载SQLiteDatabase.loadLibs(context);}public DBCipherHelper(Context context) {this(context, DB_NAME, null, DB_VERSION);}/*** 创建数据库* @param db*/@Overridepublic void onCreate(SQLiteDatabase db) {//创建表createTable(db);}private void createTable(SQLiteDatabase db){String sql = "CREATE TABLE " + TABLE_NAME + "(" + FIELD_ID + " integer primary key autoincrement , " + FIELD_NAME + " text not null);"; try {db.execSQL(sql);} catch (SQLException e) {Log.e(TAG, "onCreate " + TABLE_NAME + "Error" + e.toString());return;}}/*** 数据库升级* @param db* @param oldVersion* @param newVersion*/@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}}注意:SQLiteDatabase.loadLibs(context);这个千万别忘记调⽤3.)创建⼀个DBCipherManager数据库管理具体实现传统的SQLiteOpenHelper都是完全相同的,不同的地⽅在获取数据库句柄的地⽅传统⽅式://获取可写数据库SQLiteDatabase db = dbHelper.getWritableDatabase();//获取可读数据库SQLiteDatabase db = dbHelper.getReadableDatabase();现在的⽅式:需要传⼊⼀个password,这个password就是⽤于加密的秘钥//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD);//获取可读数据库SQLiteDatabase db = dbHelper.getReadableDatabase(DBCipherHelper.DB_PWD);接下来就是具体实现:import android.content.ContentValues;import android.content.Context;import android.util.Log;import net.sqlcipher.Cursor;import net.sqlcipher.SQLException;import net.sqlcipher.database.SQLiteDatabase;/*** 数据库管理者 - 提供数据库封装**/public class DBCipherManager {private static final String TAG = "DatabaseManager";// 静态引⽤private volatile static DBCipherManager mInstance;// DatabaseHelperprivate DBCipherHelper dbHelper;private DBCipherManager(Context context) {dbHelper = new DBCipherHelper(context.getApplicationContext());}/*** 获取单例引⽤** @param context* @return*/public static DBCipherManager getInstance(Context context) {DBCipherManager inst = mInstance;if (inst == null) {synchronized (DBCipherManager.class) {inst = mInstance;if (inst == null) {inst = new DBCipherManager(context);mInstance = inst;}}}return inst;}/*** 插⼊数据*/public void insertData(String name) {//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD); //⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBCipherHelper.FIELD_NAME, name);// insert 操作db.insert(DBCipherHelper.TABLE_NAME, null, cv);//关闭数据库db.close();}/*** 未开启事务批量插⼊* @param testCount*/public void insertDatasByNomarl(int testCount){//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD); for(int i =0;i<testCount;i++ ){//⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBCipherHelper.FIELD_NAME, String.valueOf(i));// insert 操作db.insert(DBCipherHelper.TABLE_NAME, null, cv);Log.e(TAG, "insertDatasByNomarl");}//关闭数据库db.close();}/*** 测试开启事务批量插⼊* @param testCount*/public void insertDatasByTransaction(int testCount){//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD); db.beginTransaction(); //⼿动设置开始事务try{//批量处理操作for(int i =0;i<testCount;i++ ){//⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBCipherHelper.FIELD_NAME, String.valueOf(i));// insert 操作db.insert(DBCipherHelper.TABLE_NAME, null, cv);Log.e(TAG, "insertDatasByTransaction");db.setTransactionSuccessful(); //设置事务处理成功,不设置会⾃动回滚不提交}catch(Exception e){}finally{db.endTransaction(); //处理完成//关闭数据库db.close();}}/*** 删除数据*/public void deleteData(String name) {//⽣成条件语句StringBuffer whereBuffer = new StringBuffer();whereBuffer.append(DBCipherHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'"); //获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD);// delete 操作db.delete(DBCipherHelper.TABLE_NAME, whereBuffer.toString(), null);//关闭数据库db.close();}/*** 删除所有数据*/public void deleteDatas(){String sql="delete from "+ DBCipherHelper.TABLE_NAME;execSQL(sql);}/*** 更新数据*/public void updateData(String name) {//⽣成条件语句StringBuffer whereBuffer = new StringBuffer();whereBuffer.append(DBCipherHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'"); //⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBCipherHelper.FIELD_NAME, name+name);//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD);// update 操作db.update(DBCipherHelper.TABLE_NAME, cv, whereBuffer.toString(), null);//关闭数据库db.close();}/*** 指定条件查询数据*/public void queryDatas(String name){//⽣成条件语句StringBuffer whereBuffer = new StringBuffer();whereBuffer.append(DBCipherHelper.FIELD_NAME).append(" = ").append("'").append(name).append("'"); //指定要查询的是哪⼏列数据String[] columns = {DBCipherHelper.FIELD_NAME};//获取可读数据库SQLiteDatabase db = dbHelper.getReadableDatabase(DBCipherHelper.DB_PWD);//查询数据库Cursor cursor = null;try {cursor = db.query(DBCipherHelper.TABLE_NAME, columns, whereBuffer.toString(), null, null, null, null); while (cursor.moveToNext()) {int count = cursor.getColumnCount();String columName = cursor.getColumnName(0);String tname = cursor.getString(0);Log.e(TAG, "count = " + count + " columName = " + columName + " name = " +tname);}if (cursor != null) {cursor.close();} catch (SQLException e) {Log.e(TAG, "queryDatas" + e.toString());}//关闭数据库db.close();}/*** 查询全部数据*/public void queryDatas(){//指定要查询的是哪⼏列数据String[] columns = {DBCipherHelper.FIELD_NAME};//获取可读数据库SQLiteDatabase db = dbHelper.getReadableDatabase(DBCipherHelper.DB_PWD);//查询数据库Cursor cursor = null;try {cursor = db.query(DBCipherHelper.TABLE_NAME, columns, null, null, null, null, null);//获取数据游标 while (cursor.moveToNext()) {int count = cursor.getColumnCount();String columeName = cursor.getColumnName(0);//获取表结构列名String name = cursor.getString(0);//获取表结构列数据Log.e(TAG, "count = " + count + " columName = " + columeName + " name = " +name);}//关闭游标防⽌内存泄漏if (cursor != null) {cursor.close();}} catch (SQLException e) {Log.e(TAG, "queryDatas" + e.toString());}//关闭数据库db.close();}/*** 执⾏sql语句*/private void execSQL(String sql){//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase(DBCipherHelper.DB_PWD);//直接执⾏sql语句db.execSQL(sql);//或者//关闭数据库db.close();}}4.)具体怎么调⽤//清空数据DBCipherManager.getInstance(MainActivity.this).deleteDatas();//插⼊数据for (int i = 0; i < 10; i++) {DBCipherManager.getInstance(MainActivity.this).insertData(String.valueOf(i));}//删除数据DBCipherManager.getInstance(MainActivity.this).deleteData(String.valueOf(5));//更新数据DBCipherManager.getInstance(MainActivity.this).updateData(String.valueOf(3));//查询数据DBCipherManager.getInstance(MainActivity.this).queryDatas();5.)事务⽀持和传统⽅式⼀样//获取写数据库SQLiteDatabase db = dbHelper.getWritableDatabase();db.beginTransaction(); //⼿动设置开始事务try{//在此处理批量操作for(int i =0;i<testCount;i++ ){//⽣成要修改或者插⼊的键值ContentValues cv = new ContentValues();cv.put(DBHelper.FIELD_NAME, String.valueOf(i));// insert 操作db.insert(DBHelper.TABLE_NAME, null, cv);}db.setTransactionSuccessful(); //设置事务处理成功,不设置会⾃动回滚不提交}catch(Exception e){}finally{db.endTransaction(); //处理完成//关闭数据库db.close();}总结:SQLCipher使⽤总结到此结束。

AndroidStudioAndroid数据存储五种方式总结

AndroidStudioAndroid数据存储五种方式总结

AndroidStudioAndroid数据存储五种方式总结本文介绍Android平台进行数据存储的五大方式,分别如下:1 使用SharedPreferences存储数据2 文件存储数据3 SQLite数据库存储数据4 使用ContentProvider存储数据5 网络存储数据第一种:使用SharedPreferences存储数据SharedPreferencese的使用:https:///augfun/article/details/54563808 适用范围:保存少量的数据,且这些数据的格式非常简单:字符串型、基本类型的值。

比如应用程序的各种配置信息(如是否打开音效、是否使用震动效果、小游戏的玩家积分等),解锁口令密码等。

核心原理:保存基于XML文件存储的key-value键值对数据,通常用来存储一些简单的配置信息。

通过DDMS的File Explorer面板,展开文件浏览树,很明显SharedPreferences数据总是存储在/data/data//shared_prefs目录下。

SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过SharedPreferences.edit()获取的内部接口Editor对象实现。

SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name, int mode)方法来获取SharedPreferences实例class ViewOcl implements View.OnClickListener{undefined @Overridepublic void onClick(View v) {switch(v.getId()){case R.id.btnSet://步骤1:获取输入值String code = txtCode.getText().toString().trim();//步骤2-1:创建一个SharedPreferences.Editor接口对象,lock 表示要写入的XML文件名,MODE_WORLD_WRITEABLE写操作SharedPreferences.Editor editor = getSharedPreferences("lo ck", MODE_WORLD_WRITEABLE).edit();//步骤2-2:将获取过来的值放入文件editor.putString("code", code);//步骤3:提交mit();Toast.makeText(getApplicationContext(), "口令设置成功", Toast.LENGTH_LONG).show();break;case R.id.btnGet://步骤1:创建一个SharedPreferences接口对象SharedPreferences read = getSharedPreferences("lock", MO DE_WORLD_READABLE);//步骤2:获取文件中的值String value = read.getString("code", "");Toast.makeText(getApplicationContext(), "口令为:"+value, Toast.LENGTH_LONG).show();break;}12345678910111213141516171819202122232425第二种:文件存储数据核心原理: Context提供了两个方法来打开数据文件里的文件IO流FileInputStream openFileInput(String name); FileOutputStream(String name , int mode),这两个方法第一个参数用于指定文件名,第二个参数指定打开文件的模式。

AndroidSQLite数据库加密的操作方法

AndroidSQLite数据库加密的操作方法

AndroidSQLite数据库加密的操作⽅法⼀、前⾔SQLite是⼀个轻量级的、跨平台的、开源的嵌⼊式数据库引擎,也是⼀个关系型的的使⽤SQL语句的数据库引擎,读写效率⾼、资源消耗总量少、延迟时间少,使其成为移动平台数据库的最佳解决⽅案(如Android、iOS)但是Android上⾃带的SQLite数据库是没有实现加密的,我们可以通过Android Studio直接导出应⽤创建的数据库⽂件,然后通过如SQLite Expere Personal 这种可视化⼯具打开数据库⽂件进⾏查看数据库的表结构,以及数据,这就导致存储在SQLite中的数据可以被任何⼈查看,如果是⼀些账号密码,或者聊天数据等,那么我们的应⽤就⾯临着严重的安全漏洞隐患;⼆、数据库加密⽅法因为Android⾃带的SQLite数据库本⾝是没有实现加密的,那我们如何实现对数据库的加密呢?(1)对SQLite数据库的数据进⾏加密我们可以在程序中对保存到数据库中的数据进⾏加密后保存,然后查询数据的时候,对查询的数据进⾏解密后使⽤,如果还不希望别⼈看到数据库的表结构,我们可以对数据库名字,表名,表中的字段名字使⽤MD5等加密⼿段加密后再进⾏操作;这种⽅法是可以达到数据库加密的⽬的的,但是相对来说操作就⽐较繁琐了(2)使⽤SQLCipher对SQLite数据库加密SQLCipher是基于SQLite基础之上实现了数据库加密的开源库,可以采⽤第三⽅的开源框架SQLCipher,SQLCipher是基于原⽣SQlite数据库进⾏扩展,实现数据库整体加密(数据库⽂件加密),提供的数据库的操作接⼝,和原⽣的SQLite数据库操作接⼝基本⼀样的;我们创建或者打开数据库都需要密码,我们打开数据库时的密码,需要和创建数据库时的密码保护⼀致,否则打开数据库时会报错,提⽰打开的⽂件不是⼀个数据库⽂件net.sqlcipher.database.SQLiteException: file is not a database;我们导出的数据库⽂件,通过SQLite Expere Personal这类可视化⼯具也是⽆法直接打开的;但是可以使⽤DB Browser for Sqlite这个数据库查看⼯具进⾏查看,查看的时候输⼊创建数据库时使⽤的加密密码SQLCipher的特点:SQLCipher 占⽤空间⼩,性能好,因此⾮常适合保护嵌⼊式应⽤程序数据库,⾮常适合移动开发。

Android教程04 数据库

Android教程04 数据库

第二步需要在AndroidManifest.xml使用<provider>对 该ContentProvider进行配置,为了能让其他应用找到 该ContentProvider , ContentProvider 采用了 authorities(主机名/域名)对它进行唯一标识,可以 把 ContentProvider看作是一个网站,authorities 就 是网站域名:
创建新的数据库
SQLiteDatabase myDataBase=this.openOrCreateDatabase("myDataBase.db", MODE_PRIVATE, new CursorFactory(){ //创建新的数据库,名称myDatabase,模式MODE_PRIVATE,光标工厂 //工厂类,一个可选工厂类,当查询时调用来实例化一个光标 @Override public Cursor newCursor(SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, SQLiteQuery query) { // TODO Auto-generated method stub return null; } });
目录:/data/data/<包>/shared_prefs/***.xml
XML文件名
文件用来存储大数量的数据 采用java.io.*库所提供有I/O接口,读写文件。 只有本地文件可以被访问
优点:可以存储大容量的数据 缺点:文件更新或是格式改变可能会导致巨大的编 程工作
读文件
Context.openFileInput(String name)打开一个与应 用程序联系的私有文件输入流 当文件不存在时抛出FileNotFoundException 异常

Android中对数据库进行的增删查改操作

Android中对数据库进行的增删查改操作

Android中对数据库进行的增删查改操作Android开发中,数据库是一项重要的技术,用于存储和管理应用程序的结构化数据。

在开发过程中,对数据库进行增删查改操作是常见的需求。

本文将介绍Android中对数据库进行增删查改操作的方法和技巧。

一、引入数据库依赖在Android开发中,使用SQLite数据库是一种常见的选择。

首先,我们需要引入SQLite数据库的依赖库。

在项目的build.gradle文件中,添加以下代码:```dependencies {implementation 'androidx.sqlite:sqlite:2.1.0'}```二、创建数据库在进行数据库操作之前,我们需要先创建数据库。

在Android中,可以继承SQLiteOpenHelper类来创建和管理数据库。

下面是一个创建数据库的示例代码:```javapublic class MyDatabaseHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "my_database";private static final int DATABASE_VERSION = 1;public MyDatabaseHelper(Context context) {super(context, DATABASE_NAME, null,DATABASE_VERSION);}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 在数据库版本更新时执行的操作}}```在上述代码中,我们通过`CREATE TABLE`语句创建了一个名为"users"的表,该表包含id、name和age三个字段。

Android 创建与删除数据库最有效的方法

Android 创建与删除数据库最有效的方法

数据库SQLite介绍数据库最经典的四个操作添加、删除、修改、查找,在处理大量数据的时候使用数据库可以帮我们迅速定位当前须要处理的数据,举个例子好比现在要实现一个搜索功能用数据库的话只须要其中一个搜索条件一个数据库语句就可以迅速的在N条数据中找到我们需要的数据,如果不使用数据库那么查找起来会非常麻烦,效率大打折扣,所以在处理大量数据的时候使用数据库是明确的选择,在Android的开发中使用的数据库是SQLite ,它是一个轻量级的数据库、非常小、移植性好、效率高、可靠,嵌入式设备因为受到硬件条件的限制所以非常适合使用 SQLite 数据库。

创建与删除数据库封装一个类去继承SQLiteOpenHelper 在构造函数中传入数据库名称与数据库版本号,数据库被创建的时候会调用onCreate(SQLiteDatabase db) 方法,数据库版本号发生改变的时候会调用onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法,可以方便的对软件游戏升级后做出相应处理避免覆盖安装数据库发生改变产生的错误。

调用SQLiteOpenHelper 的getReadableDatabase()方法去创建数据库,如果数据库不存在则创建并且返回SQLiteDatabase对象,如果数据库存在则不创建只返回SQLiteDatabase对象。

调用deleteDatabase(DATABASE_NAME)方法传入数据库名称则可删除数据库。

封装了一个DatabaseHelper类继承SQLiteOpenHelper 我使用了设计模式中的单例模式来处理这个类,这里说一下单例模式单例模式是常见的代码设计模式之一它的好处是在于避免在内存中频繁的实例化所以将它的对象写成static 静态这样它的对象就只有一份存在静态内存区使用的时候只须要通过getInstance()就可以直接拿到这个静态对象。

android中数据库查询方法query

android中数据库查询方法query

Android 中数据库查询方法query() 中的selectAndroid 中涉及数据库查询的地方一般都会有一个query() 方法,而这些query 中有大都(全部?)会有一个参数selectionArgs,比如下面这个android.database.sqlite.SQLiteDatabase.query():view plaincopy to clipboardprint?public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)selection 参数很好理解,就是SQL 语句中WHERE 后面的部分,即过滤条件,比如可以为id=3 AND name='Kevin Yuan' 表示只返回满足id 为 3 且name 为"Kevin Yuan" 的记录。

再实际项目中像上面那样简单的“静态”的selection 并不多见,更多的情况下要在运行时动态生成这个字符串,比如view plaincopy to clipboardprint?public doQuery(long id, final String name) {mDb.query("some_table", // table namenull, // columns"id=" + id + " AND name='" + name + "'", // selection//...... 更多参数省略);}public doQuery(long id, final String name) {mDb.query("some_table", // table namenull, // columns"id=" + id + " AND name='" + name + "'", // selection//...... 更多参数省略);}在这种情况下就要考虑一个字符转义的问题,比如如果在上面代码中传进来的name 参数的内容里面有单引号('),就会引发一个"SQLiteException syntax error .... "。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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语句对数据库进行的操作十一:基于对象的对数据库的操作。

相关文档
最新文档