第十二章:Android数据存储(下)
一、SQLite介绍
提到数据存储问题,数据库是不得不提的。数据库是用来存储关系型数据的不二利器。Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用。Android的数据库应用,依托于当下最流行的开源嵌入式数据库SQLite。在Android中,应用的数据库文件是该应用私有的,存储在应用数据目录下的databases子目录内。从代码结构来看,Android的数据库实现可以分成两个层次,在底层通过C++调用SQLite的接口来执行SQL语句,并通过JNI向上暴露Java可访问的接口。
SQLite可视化工具:SQLite Expert Professional 3;
二、Android访问SQLite
主要步骤:
1.打开数据库
2.insert语句
ContentValues values = new ContentValues();
values.put("name","xiazdong");
values.put("age",20);
db.insert("tablename",null,values);
3.delete语句
4.update语句
db.exeSQL("update person set age=? where name=?",new Object[]{30,"xiazdong"});
ContentValues values = new ContentValues();
values.put("age",30);/*set子句*/
db.update("tablename",values,"name=?"/*where子句*/,new String[]{"xiazdong"}/*where子句参数*/);
5.query语句
Cursor cursor = db.rawQuery("select * from person where name=?",new Object[]{"xiazdong"});
while(cursor.moveToNext()){
//int index = cursor.getColumnIndex(String name);//根据name获得索引
//String name = cursor.getString(int index); //根据索引获得值
String name = cursor.getString(cursor.getColumnIndex("name"));
}
6.分页语句
7.获得记录个数语句
Cursor cursor = db.rawQuery("select count(*) from person", null);
cursor.moveToFirst();
int count = cursor.getInt(0);
package com.example.helloandroid; import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory; public class MySQLiteOpenHelper extends SQLiteOpenHelper { public MySQLiteOpenHelper(Context context, String name,
CursorFactory factory, int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub } @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub } }
DataBaseActivity.java
package com.example.helloandroid; import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast; public class DataBaseActivity extends Activity {
private Button createDatabase, createTable, selectData, insertData,
updateData, deleteDaata;
private MySQLiteOpenHelper helper; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data_base); // 初始化按钮
createDatabase = (Button) findViewById(R.id.createDatabase);
createTable = (Button) findViewById(R.id.createTable);
selectData = (Button) findViewById(R.id.selectData);
insertData = (Button) findViewById(R.id.insertData);
updateData = (Button) findViewById(R.id.updateData);
deleteDaata = (Button) findViewById(R.id.deleteDaata); helper = new MySQLiteOpenHelper(DataBaseActivity.this, "mydb.db",
null, 1); /*
* 创建数据库
*/
createDatabase.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
Toast.makeText(DataBaseActivity.this, "数据库创建成功", 1000).show(); } }); /*
* 创建表
*/
createTable.setOnClickListener(new OnClickListener() { public void onClick(View arg0) {
// TODO Auto-generated method stub
SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
// 创建表
sqlitedatabase
.execSQL("create table student(id INTEGER PRIMARY KEY autoincrement,name text)");
Toast.makeText(DataBaseActivity.this, "表创建成功", 1000).show();
}
}); /*
* 插入数据
*/ insertData.setOnClickListener(new OnClickListener() { public void onClick(View v) {
// TODO Auto-generated method stub
SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
sqlitedatabase
.execSQL("insert into student(name) values ('tinyphp')");
Toast.makeText(DataBaseActivity.this, "插入数据成功", 1000).show();
}
}); /*
* 更新数据
*/
updateData.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();
sqlitedatabase
.execSQL("update student set name='monkey' where id='1'");
Toast.makeText(DataBaseActivity.this, "数据更新成功", 1000).show();
}
}); /*
* 查询数据
*/ selectData.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
SQLiteDatabase sqlitedatabase = helper.getReadableDatabase(); //参数:表名、查询的列、查询条件、查询参数、查询结果分组、分组结果限制、排序
Cursor cursor = sqlitedatabase.query("student", new String[] {
"id", "name" }, "id=?", new String[] { "1" }, null,
null, null);
String name=null;
while(cursor.moveToNext()){
name =cursor.getString(cursor.getColumnIndex("name"));
}
Toast.makeText(DataBaseActivity.this, "查询结果name为:"+name, 1000).show();
}
}); /*
* 删除数据
* */ deleteDaata.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// TODO Auto-generated method stub
SQLiteDatabase sqlitedatabase =helper.getWritableDatabase();
sqlitedatabase.delete("student", "id=?", new String[]{"1"});
Toast.makeText(DataBaseActivity.this, "数据删除成功", 1000).show();
}
}); }
}
activity_data_base.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <Button
android:id="@+id/createDatabase"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建数据库" /> <Button
android:id="@+id/createTable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="创建表" /> <Button
android:id="@+id/insertData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="插入" /> <Button
android:id="@+id/updateData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="更新" /> <Button
android:id="@+id/selectData"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="查询" /> <Button
android:id="@+id/deleteDaata"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="删除" />
</LinearLayout>
效果图:
第十二章:Android数据存储(下)的更多相关文章
- 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高
第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...
- 第8章 Android数据存储与IO——File存储
openFileOutput/openFileInput 这是android自带的两种解决方案.
- Android - 数据存储 -存储键值对
如果你有少量的键值数据需要存储,可以使用SharedPreferencesAPI.SharedPreferences对象指向一个包含键值对的文件并且提供了一些简单的方法来读取它们.每个SharedPr ...
- Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验
Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...
- 【Android开发日记】之入门篇(八)——Android数据存储(下)
废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...
- 《Django By Example》第十二章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第十二章,全书最后一章,终于到这章 ...
- 【Android开发日记】之入门篇(十二)——Android组件间的数据传输
组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...
- 《Django By Example》第十二章(终章) 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第十二章,全书最后一章,终于到这章 ...
- 进击的Python【第十二章】:mysql介绍与简单操作,sqlachemy介绍与简单应用
进击的Python[第十二章]:mysql介绍与简单操作,sqlachemy介绍与简单应用 一.数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数 ...
- 第十二章 Python文件操作【转】
12.1 open() open()函数作用是打开文件,返回一个文件对象. 用法格式:open(name[, mode[, buffering[,encoding]]]) -> file obj ...
随机推荐
- android自定义进度圆与定时任务
先看代码:自定进度圆 public class ProgressCircle extends View { private Paint paint; private int strokewidth = ...
- mongodb下载、安装、配置服务启动、及可视化工具下载、使用
MongoDB: 1.下载地址:http://www.mongodb.org/downloads(32位还是64位自行选择).我下载的是:mongodb-win32-x86_64-3.2.4-sign ...
- 《CSS3秘籍》(第三版)-读书笔记(4)
第12章 CSS页面布局 网页布局的类型: 固定宽度.不管浏览器窗口的宽度多大,网页内容的宽度始终保持不变. 流式.流式设计采用百分比,它会根据浏览器的宽度(无论有多宽)自动进行调整.网页会随着访问 ...
- String与StringBuffer的区别
首先,String和StringBuffer主要有2个区别: (1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringB ...
- GIS开发环境全面升级10.1
最近,因为公司开发的需要,对开发环境进行全面的升级,在这其中也遇到了不少问题,在之后将陆续整理出来,以便以后查看. 之前开发环境:VS2008,ArcGIS9.3,ArcEngine9.3,Oracl ...
- Android自动化预备(下)
上次说道:要具备的一些知识,还有多ADB得理解 本次继续ADB理解: AndroidDebugBridge debugBridge =AndroidDebugBridge.createBridge(& ...
- 拓扑排序 POJ 2367
今天网易的笔试,妹的,算法题没能A掉,虽然按照思路写了出来,但是尼玛好歹给个测试用例的格式呀,吐槽一下网易的笔试出的太烂了. 就一道算法题,比较石子重量,个人以为解法应该是拓扑排序. 就去POJ找了道 ...
- canvas基本用法
1.canvas和其他标签一样使用,但是IE8以下是不支持的,可以在canvas里面加一个span用来提示,例如: <canvas> <span>IE8不支持canvas< ...
- coreseek实战(四):php接口的使用,完善php脚本代码
coreseek实战(四):php接口的使用,完善php脚本代码 在上一篇文章 coreseeek实战(三)中,已经能够正常搜索到结果,这篇文章主要是把 index.php 文件代码写得相对完整一点点 ...
- IOS线程的一些总结
主线程的作用 (在主线程中才能设置) 显示/刷新UI界面 处理UI事件(比如点击事件.滚动事件.拖拽事件): 主线程的使用注意 别将比较耗时的操作放到主线程中. 耗时操作会卡住主线程.影响体验. [N ...