`

玩转Android---组件篇---数据存储之SQLite

阅读更多

Android中通过SQLite数据库引擎来实现结构化数据存储。SQLite是一个嵌入式数据库引擎,针对内存等资源有限的设备(如手机、PDA、MP3)提供的一种高效的数据库引擎。

SQLite数据库不想其他的数据库(如Oracle),它没有服务器进程。所有的内容包含在同一个单文件中。该文件是跨平台的,可以自由复制。基于其自身的先天优势,SQLite在嵌入式领域得到广泛应用。Android也没有重复发明“轮子”,而是直接是用了SQLite数据库。

 

 

一、SQLiteDatabase

Android提供了创建和是用SQLite数据库的API。SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法,另外还有一个SQLiteOpenHelper工具类提供了更简洁的功能。在Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库、创建表和执行一些SQL语句。下面我们先看看SQLiteDatabase的常用方法。

 

SQLiteDatabase的常用方法

 

方法名称

方法描述

openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory)

打开或创建数据库

insert(String table,String nullColumnHack,ContentValues values)

添加一条记录

delete(String table,String whereClause,String[] whereArgs)

删除一条记录

query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)

查询一条记录

update(String table,ContentValues values,String whereClause,String[] whereArgs)

修改记录

execSQL(String sql)

执行一条SQL语句

close()

关闭数据库

 

1、打开或者创建数据库

可以使用SQLiteDatabase的静态方法openOrCreateDatabase(String path,SQLiteDatabae.CursorFactory factory)打开或者创建一个数据库,该方法的第一个参数是数据库的创建路径,注意这个路径一定是数据库的全路径。例如/data/data/package/databases/dbname.db。第二个参数是指定返回一个Cursor子类的工厂,如果没有指定(null)则使用默认工厂。

下面的代码创建了一个temp.db数据库

SQLiteDatabase.openOrCreateDatabase("/data/data/com.hualang.test/databases/temp.db",null);

 

2、创建表

创建一张表很简单。首先,编写创建表的SQL语句,然后,调用SQLiteDatabase的execSQL()方法便可以创建一张表了。

下面的代码创建了一张用户表,属性列为:id(主键并且自动增加)、username(用户名称)、password(密码)

private void createTable(SQLiteDatabase db)

{

      //创建表SQL语句

      String sql="create table usertable(id integer primary key autoincrement,username text,password text)";

      //执行SQL语句

      db.execSQL(sql);

}

 

3、插入数据

插入数据有两种方法:一种是调用SQLiteDatabase的insert(String table,String nullColumnHack,ContentValues values)方法,该方法的第一个参数是表名称,第二个参数是空列的默认值,第三个参数是ContentValues类型的一个封装了列名称和列值的Map;令一种方法是编写插入数据的SQL语句,直接调用SQLiteDatabase的execSQL()方法来执行

 

下面的代码演示了如何插入一条记录到数据库。

方法1:

//插入数据

private void insert(SQLiteDatabase db)

{

     //插入数据SQL语句

     String sql="insert into usertable(username,password) values('hualang','123456')";

    //执行SQL语句

     db.execSQL(sql);

}

 

方法2:

private void insert(SQLiteDatabase db)

{

    //实例化常量值

    ContentValues cv = new ContentValues();

    //添加用户名

    cv.put("username","hualang");

    //添加密码

    cv.put("password","123456");

    //插入

    db.insert("usertable",null,cv);

}

 

4、删除数据

和插入数据类似,删除数据也有两种方法:一种是调用SQLiteDatabase的delete(String table,String whereClause,String[] whereArgs)方法,该方法的第一个参数是表名称,第二个参数是删除条件,第三个参数是删除条件值数组;另一种方法是编写删除SQL语句,调用SQLiteDatabase的execSQL()方法来执行删除。

下面代码演示了如何删除记录

方法1:

//删除

private void delete(SQLiteDatabase db)

{

   //删除SQL语句

   String sql = "delete from usertable where id  = 6";

   //执行SQL语句

   db.execSQL(sql);

}

方法2:

private void delete(SQLiteDatabase db)

{

   //删除条件

   String whereClause = "id=?";

   //删除条件参数

   String[] whereArgs = {String.valueOf(5)};

   //执行删除

   db.delete("usertable",whereClause,whereArgs);

}

 

5、查询数据

查询数据相对比较傲复杂,因为查询可能会带来很多条件。不过熟悉SQL查询的读者都知道这只不过是把查询SQL封装成方法而已。下面看一个查询方法。

public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

各个参数的意义说明:

①table:表名称

②columns:列名称数组

③selection:条件字句,相当于where

④selectionArgs:条件字句,参数数组

⑤groupBy:分组列

⑥having:分组条件

⑦orderBy:排序列

⑧limit:分页查询限制

⑨Cursor:返回值,相当于结果集ResultSet

Cursor是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getString()等.

Cursor游标常用方法

 

方法名称

方法描述

getCount()

总记录条数

isFirst()

判断是否第一条记录

isLast()

判断是否最后一条记录

moveToFirst()

移动到第一条记录

moveToLast()

移动到最后一条记录

move(int offset)

移动到指定记录

moveToNext()

移动到下一条记录

moveToPrevious()

移动到上一条记录

getColumnIndexOrThrow(String columnName)

根据列名称获得列索引

getInt(int columnIndex)

获得指定列索引的int类型值

getString(int columnIndex)

获得指定列缩影的String类型值

 

下面的代码演示了如何查询数据类型

private void query(SQLiteDatabase db)

{

   //查询获得游标

   Cursor c = db.query("usertable",null,null,null,null,null,null);

   //判断游标是否为空

   if(c.moveToFirst())

   {

       //遍历游标

       for(int i=0;i<c.getCount();i++)

       {

            c.move(i);

            //获得ID

            int id = c.getInt(0);

            //获得用户名

            String username=c.getString(1);

            //获得密码

            String password=c.getString(2);

            //输出用户信息

            System.out.println(id+":"+username+":"+password);

       }

   }

}

 

 

6、修改数据

和添加删除相同,修改数据有两种方式,一是调用SQLiteDatabase的update(String table,ContentValues values,String whereClause, String[] whereArgs)方法。该方法的第一个参数是表名称,第二个参数是更行列ContentValues类型的键值对(Map),第三个参数是更新条件(where字句),第四个参数是更新条件数组。而是编写更新的SQL语句,调用SQLiteDatabase的execSQL执行更新。

下面的代码演示了如何更新数据

private void update(SQLiteDatabase db)

{

    //修改SQL语句

    String sql = "update usertable set password = 654321 where id = 1";

    //执行SQL

    db.execSQL(sql);

}

 

方法2:

private void update(SQLiteDatabase db)

{

    //实例化内容值

    ContentValues values = new ContentValues();

    //在values中添加内容

    values.put("password","123321");

    //修改条件

    String whereClause = "id=?";

    //修改添加参数

    String[] whereArgs={String.valuesOf(1)};

    //修改

    db.update("usertable",values,whereClause,whereArgs);

}

 

 二、SQLiteOpenHelper

SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本更新,一般的用法是定义一个类继承之,并实现其抽象方法onCreate(SQLiteDatabase db)和opUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)来创建和更新数据库。

SQLiteOpenHelper常用方法

 

方法名称

方法描述

SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)

构造方法,一般是传递一个要创建的数据库名称name参数

onCreate(SQLiteDatabase db)

创建数据库时调用

onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)

版本更新时调用

getReadableDatabase()

创建或打开一个只读数据库

getWritableDatabase()

创建或打开一个读写数据库

 

例如下面的代码演示

public class MainActivity extends Activity
{
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//实例化数据库帮助类
		MyDbHelper helper = new MyDbHelper(this);
		//插入
		helper.insert();
		//查询
		helper.query();
	}
	//数据库帮助类
	class MyDbHelper extends SQLiteOpenHelper
	{
		//创建表SQL语句
		private static final String CREATE_TABLE_SQL = 
			"create table usertable(id intger,name text)";
		//SQLiteDatabase实例
		private SQLiteDatabase db;
		//构造方法
		MyDbHelper(Context c)
		{
			super(c,"test.db",null,2);
		}
		public void onCreate(SQLiteDatabase db)
		{
			db.execSQL(CREATE_TABLE_SQL);
		}
		public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)
		{

		}
		//插入方法
		private void insert()
		{
			//插入SQL语句
			String sql="insert into usertable(id,name) values(1,'hualang')";
			//执行插入
			getWriteableDatabase().execSQL(sql);
		}
		//查询方法
		private void query()
		{
			//查询获得游标
			Cursor c = getWritableDatabase().query("usertable",null,null,null,null,null,null);
			//判断游标是否为空
			if(c.moveToFirst())
			{
				//遍历游标
				for(int i=0;i<c.getCount();i++)
				{
					c.move(i);
					int id = c.getInt(0);
					String name = c.getString(1);
					System.out.println(id+":"+name);
				}
			}
		}
	}
}

 

分享到:
评论

相关推荐

    Android Studio开发俄罗斯方块(Java)

    在本项目中,"Android Studio...通过这个项目,开发者不仅可以学习到Android应用开发的基础,还能深入理解游戏开发中的特定挑战,以及如何利用SQLite实现数据存储,以及如何实现应用的本地化以适应不同地区的用户需求。

    玩转晋城源代码

    综上所述,《玩转晋城源代码》这款应用在技术实现上涵盖了Android的各个方面,包括UI设计、数据库管理、网络通信、用户认证、数据安全以及性能优化等,为开发者提供了丰富的实践机会和学习素材。

    毕业论文安卓301玩转英语app.doc

    * 数据库设计是Android应用程序开发中的关键步骤,旨在确定应用程序的数据存储结构。 * Android应用程序常用的数据库管理系统包括SQLite、MySQL、Oracle等。 * ER图是数据库设计中的重要工具,用于描述实体之间的...

    appBase之购物车demo源码

    7. **数据持久化(Data Persistence)**:购物车的内容通常需要在应用关闭后仍然保留,可以使用SharedPreferences存储简单数据,或者SQLite数据库来保存更复杂的数据结构。 8. **异常处理(Error Handling)**:在...

    一个简易的安卓相册APP Demo,字节跳动玩转客户端夏令营作业.zip

    这个压缩包文件“一个简易的安卓相册APP Demo,字节跳动玩转客户端夏令营作业.zip”包含了字节跳动在客户端夏令营活动中的一份作业,目的是让学生或参与者体验并学习如何构建一个简单的Android相册应用程序。...

    超炫的Android军旗源代码

    如果源代码包含了保存和加载游戏进度的功能,那么你需要了解SharedPreferences、SQLite数据库或JSON序列化等数据存储方式。这些技术可以帮助应用程序在用户退出后仍能记住游戏状态。 8. **调试与优化** 通过阅读...

    android 纸牌游戏

    在移动设备领域,Android操作系统占据了显著地位,而游戏作为用户最喜爱的应用类型之一,一直是开发者关注的焦点。本篇将深入探讨一个基于Android平台的21点纸牌游戏的开发过程,其中包括金币系统的实现,旨在帮助...

    Android技术总结+面试题

    【Android技术总结与面试题解析】 在Android领域,面试题往往涵盖了从基础知识到高级概念的广泛范围。以下是一些常见的Android技术知识点和面试问题的详细解答: 1. **ANR (Application Not Responding)**:当应用...

    Android应用源码猜猜红桃A.rar

    8. **数据持久化**:如果应用有保存和加载进度的功能,那么可能会用到SharedPreferences(轻量级的数据存储)或SQLite数据库(用于更复杂的数据管理)。 9. **动画与图形**:为了让应用更具吸引力,开发者可能会...

    Android游戏大战飞机源码

    8. **数据持久化**:如果游戏包含得分或其他需要保存的数据,可以使用SharedPreferences或SQLite数据库来实现数据的持久化存储。 9. **游戏逻辑**:游戏规则、计分系统、敌人生成策略等都是游戏逻辑的一部分,这...

    android开发资料

    6. **数据存储**:Android提供了SQLite数据库、SharedPreferences、内部/外部存储等方法来保存数据,根据需求选择合适的方式。 7. **异步处理**:AsyncTask、IntentService、Handler、Thread或ExecutorService等...

    Java,android,拼图游戏,实现与设计.doc

    SQLite是Android内置的轻量级数据库,适用于存储结构化数据。在拼图游戏中,我们可以创建一个数据库表来存储每个玩家完成游戏的时间、得分等信息。当用户成功完成拼图时,将相关信息插入数据库,以便后续查询和展示...

    【经典Android游戏源码15】Android 涂鸦跳跃源码

    10. **持久化数据**:游戏进度和用户设置通常需要保存在本地,Android提供了SharedPreferences和SQLite数据库等手段来存储数据。 通过深入研究这个源码,开发者不仅可以了解Android游戏开发的基本流程,还能学习到...

    Android项目源码记忆翻牌游戏源码.zip

    5. **数据存储**:游戏状态(如已翻开的牌、剩余时间等)的保存和加载,可能通过SharedPreferences或SQLite数据库进行。 6. **用户界面(UI)**:引导页和欢迎页是提升用户体验的重要元素,它们通常由ImageView、...

    开玩校安卓APP

    当用户在网络不稳定时,可以继续查看之前下载过的数据,这通常依赖于SQLite数据库或者Room库来存储本地数据。对于网络状态的检测,可能使用了ConnectivityManager或BroadcastReceiver来监听网络变化,确保适时的网络...

    Android拼图

    8. **数据持久化**:游戏进度需要保存,可以利用SharedPreferences保存简单的数据,或者使用SQLite数据库存储更复杂的信息。 9. **图片优化**:为了提高性能,需要对加载的图片进行优化,例如使用WebP格式、按需...

    电信设备-屏幕旋转的响应方法、装置、移动终端及存储介质.zip

    这通常涉及到数据持久化和状态管理,可能涉及SQLite数据库、SharedPreferences或其他存储机制。 总结,屏幕旋转的响应方法、装置、移动终端及存储介质是移动设备用户体验的重要组成部分。通过理解其工作原理和实现...

    安卓口袋微博

    "安卓口袋微博"是一款针对Android平台开发的应用程序,它提供了便捷的微博浏览、发布和互动功能,让用户在手机上也能轻松玩转社交网络。这款应用的开发涉及到Android平台的Java编程语言,以及Web服务的交互,是...

Global site tag (gtag.js) - Google Analytics