【Android开发学习05】Android中SQLite数据库操作
来源:互联网 发布:淘宝买真货退假货 编辑:程序博客网 时间:2024/05/22 16:58
SQLite特点: 体积小,独立,开源,支持多种开发语言,支持最大2TB数据库。
一.基础知识:
1.SQLite的数据类型:
NULL:空值。
INTEGER:带符号的整型,具体取决有存入数字的范围大小。
REAL:浮点数字,存储为8-byte IEEE浮点数。
TEXT:字符串文本。
BLOB:二进制对象。
smallint 16位元的整数。
interger 32位元的整数。
decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点后有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。
float 32位元的实数。
double 64位元的实数。
char(n) n 长度的字串,n不能超过 254。
varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。
graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。
vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000
date 包含了 年份、月份、日期。
time 包含了 小时、分钟、秒。
timestamp 包含了 年、月、日、时、分、秒、千分之一秒。
datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!
2.SQLite的基本操作:
①SQLiteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等操作函数。
// 创建数据库public void onCreate(SQLiteDatabase db)// 更新数据库public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)// 打开数据库public void onOpen(SQLiteDatabase db)// 得到一个可读SQLiteDatabase对象public synchronized SQLiteDatabase getReadableDatabase()// 得到一个可写SQLiteDatabase对象public synchronized SQLiteDatabase getWriteableDatabase()
②SQLiteDatabase 数据库访问类:执行对数据库的插入记录、查询记录等操作。
execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句;rawQuery()方法可以执行select语句。query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)table:表名。相当于select语句from关键字后面的部分。如果是多表联合查询,可以用逗号将两个表名分开。columns:要查询出来的列名。相当于select语句select关键字后面的部分。selection:查询条件子句,相当于select语句where关键字后面的部分,在条件子句允许使用占位符“?”selectionArgs:对应于selection语句中占位符的值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。groupBy:相当于select语句group by关键字后面的部分having:相当于select语句having关键字后面的部分orderBy:相当于select语句order by关键字后面的部分,如:personid desc, age asc;limit:指定偏移量和获取的记录数,相当于select语句limit关键字后面的部分。 //还有两个,网上貌似都用的比较少,而我们这个例子中采用的是这些:public long insert(String table, // 待插入的表名String nullColumnHack, // 通常设置为nullContentValues values// 待插入的数据)public int update(String table, // 待更新的表名ContentValues values,// 待更新的内容String whereClause,// 选择通过哪个字段来更新String [] whereArgs// 为whereClause字段要查询的值)
③下面为网上常用的访问数据库的一般流程:
public void onClick(View v) {DatabaseHelper databaseHelper = new DatabaseHelper(HelloActivity.this);SQLiteDatabase db = databaseHelper.getWritableDatabase();db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4}); db.close(); };
二.编程实现:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" ><Button android:text="创建数据库" android:id="@+id/ButtonCreate" android:layout_width="fill_parent"android:layout_height="wrap_content"></Button><!--添加一个Button控件--><Button android:text="增加数据" android:id="@+id/ButtonInsert" android:layout_width="fill_parent"android:layout_height="wrap_content"></Button><!--添加一个Button控件--><Button android:text="更新数据" android:id="@+id/ButtonUpdate" android:layout_width="fill_parent"android:layout_height="wrap_content"></Button><!--添加一个Button控件--><Button android:text="查询数据" android:id="@+id/ButtonQuery" android:layout_width="fill_parent"android:layout_height="wrap_content"></Button><!--添加一个Button控件--></LinearLayout>定义了一个垂直方向上的线性布局,及各操作的按钮,水平方向充满父窗口,垂直方向与内容等高。
界面布局效果如下:
2. 代码编辑(\src\wyf\zcl\MyActivity.java):
package wyf.zcl;import wyf.zcl.sqlitedb.SqLiteDBHelper;//引入相关包import android.app.Activity;//引入相关包import android.content.ContentValues;//引入相关包import android.database.Cursor;//引入相关包import android.database.sqlite.SQLiteDatabase;//引入相关包import android.os.Bundle;//引入相关包import android.view.View;//引入相关包import android.widget.Button;//引入相关包import android.widget.Toast;public class MyActivity extends Activity { /** Called when the activity is first created. */private Button createButton;//创建数据库按钮private Button insertBut;//增加数据库记录按钮private Button updateBut;//更新数据库记录按钮private Button queryBut;//查询数据库记录按钮 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); createButton=(Button)findViewById(R.id.ButtonCreate);//实例化创建数据库按钮 insertBut=(Button)findViewById(R.id.ButtonInsert);//实例化插入数据库按钮 updateBut=(Button)findViewById(R.id.ButtonUpdate);//实例化更新数据库按钮 queryBut=(Button)findViewById(R.id.ButtonQuery);//实例化查询数据库按钮 createButton.setOnClickListener(new View.OnClickListener() {//创建数据库时调用@Overridepublic void onClick(View v) {SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库System.out.println("create or open database success!");SQLiteDatabase sld=dh.getReadableDatabase();//得到一个SQLiteDatabase对象,用于操控数据库Toast.makeText(MyActivity.this, "创建或打开数据库", Toast.LENGTH_SHORT).show();}}); insertBut.setOnClickListener(new View.OnClickListener() {//增加数据库记录时调用@Overridepublic void onClick(View v) {ContentValues cv=new ContentValues();//得到ContentValues对象cv.put("uid", 1);//放入键值对,键要与列名一致,值要与列的数据类型一致cv.put("uname", "zcl");//放入键值对,键要与列名一致,值要与列的数据类型一致SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库Toast.makeText(MyActivity.this, "插入记录", Toast.LENGTH_SHORT).show();SQLiteDatabase sld=dh.getWritableDatabase();//得到一个SQLiteDatabase对象,用于操控数据库sld.insert("sqlitetest", null, cv);//增加数据库记录System.out.println("success insert a new content!");}}); updateBut.setOnClickListener(new View.OnClickListener() { //更新数据库记录时调用@Overridepublic void onClick(View v) {SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库SQLiteDatabase sld=dh.getWritableDatabase();//得到一个SQLiteDatabase对象,用于操控数据库ContentValues cv = new ContentValues();//得到ContentValues对象Toast.makeText(MyActivity.this, "更新记录", Toast.LENGTH_SHORT).show();cv.put("uname", "zcl_update");sld.update("sqlitetest", cv, "uid=?", new String[]{"1"});//更新数据库记录System.out.println("success updata the content!");}}); queryBut.setOnClickListener(new View.OnClickListener() { //查询数据库记录时调用@Overridepublic void onClick(View v) {SqLiteDBHelper dh=new SqLiteDBHelper(MyActivity.this,"testdb",null,1);//创建数据库Toast.makeText(MyActivity.this, "查询记录", Toast.LENGTH_SHORT).show();SQLiteDatabase sld=dh.getReadableDatabase();//得到一个SQLiteDatabase对象,用于操控数据库Cursor cursor=sld.query("sqlitetest", new String[]{"uid","uname"}, "uid=?", new String[]{"1"}, null, null, null);while(cursor.moveToNext()){//打印输出String name=cursor.getString(cursor.getColumnIndex("uname"));System.out.println("query result:"+name);}}}); }}
(\src\wyf\zcl\zcl\sqlitedb\SqLiteDBHelper.java):
package wyf.zcl.sqlitedb;import android.content.Context;//引入相关包import android.database.sqlite.SQLiteDatabase;//引入相关包import android.database.sqlite.SQLiteOpenHelper;//引入相关包import android.database.sqlite.SQLiteDatabase.CursorFactory;//引入相关包public class SqLiteDBHelper extends SQLiteOpenHelper{public SqLiteDBHelper(Context context, String name, CursorFactory factory,int version) {//继承SQLiteOpenHelper的类,必须有该构造函数super(context, name, factory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {//创建数据库时调用,此方法是在调用了getReadableDatabase()或getWritableDatabase()后才调用db.execSQL("create table sqlitetest(uid long,uname varchar(25))");System.out.println("already create a database:sqlitetest.");}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//升级数据库时掉用}}
附加一些本人使用的一些代码:
public long GetSingerCount(){String tTempParam;Cursor tTempIdCursor;long singerCount=0;tTempParam="select count(*) from singerlist ;";tTempIdCursor = tSingerDb.rawQuery(tTempParam, null);tTempIdCursor.moveToFirst();singerCount=tTempIdCursor.getLong(0);tTempIdCursor.close();System.out.println("singerCount ========= "+singerCount);return singerCount;}
本文博客源地址:http://blog.csdn.net/ypist
- 【Android开发学习05】Android中SQLite数据库操作
- Android开发中SQLite数据库操作(一)
- Android开发中SQLite数据库操作(二)
- Android中操作SQLite数据库再学习
- android中sqlite数据库操作
- android中SQLite数据库操作
- Android学习开发笔记之SQLite数据库操作
- android开发第五天sqlite数据库操作
- android开发第五天sqlite数据库操作
- Android开发-SQLite数据库-常用操作
- android sqlite数据库操作
- Android数据库操作--------SQLite
- android数据库SQLite操作
- android 数据库 sqlite 操作
- android SQLite数据库操作
- Android SQLite数据库操作
- Android SQLite数据库操作
- Android sqlite 数据库操作
- Android NFC 开发教程(2): ApiDemos->NFC->ForegoundDispatch
- ASSERTC语言实现
- 重用java.util.Observable类
- stdout 与 stderr 区别
- Andorid时间控件和日期控件的Demo(代码)
- 【Android开发学习05】Android中SQLite数据库操作
- VBscript中的正则表达式
- Android NFC 开发教程(3): Mifare Tag 读写示例
- ubuntu 12.04 应用源安装RTEMS 4.11的开发工具
- 32位程序移植到64位需要考虑的问题
- Extjs4.1:gridPanel不显示数据问题的解决
- Linux alsa 声卡驱动 安装 卸载 设置默认声卡
- ios 平台编译器支持一览表
- Oracle Agile 有用户无法收到PLM系统发出的相关邮件通知