Android开发怎么查看和管理ios 查看sqlite数据库库

今天看啥 热点:
Android开发之SQLite数据库详解
Android开发之SQLite数据库详解
请尊重他人的劳动成果,转载请注明出处:Android开发之SQLite数据库详解
http://blog.csdn.net/fengyuzhengfan/article/details/
Android系统集成了一个轻量级的数据库:SQLite, SQLite并不想成为像Oracle、MySQL那样的专业数据库。SQLite只是一个嵌入式的数据库引擎,专门适用于资源有限的设备上(如手机、PDA等)适量数据存取。
虽然SQLite支持绝大部分SQL92语法,也允许开发者使用SQL语句操作数据库中的数据,但SQLite并不像Orade、MySQL数据库那样需要安装、启动服务器进程,SQLite数据库只是一个文件。
从本质上来看,SQLite的操作方式只是一种更为便捷的文件操作。后面我们会看到,当应用程序创建或打开一个SQLite数据库时,其实只是打开一个文件准备读写,因此有人说SQLite有点像Microsoft的Access
(实际上SQLite功能要强大得多)。
1.SQLiteDatabase
Android提供了SQLiteDatabase
代表一个数据库(底层就是一个数据库文件>,一旦应用程序获得了代表指定数据库的SQLiteDatabase 对象,接下来就可通过SQLiteDatabase 对象来管理、操作数据库了。
2.打开获取创建SQLiteDatabase的方法:
1)staticSQLiteDatabase
openDatabase(Stringpath,SQLiteDatabase .CursorFactory
factory, intflags):打开path文件所代表的SQLite数据库。
2)staticSQLiteDatabase
openOrCreateDatabase(File
file,SQLiteDatabase
.CursorFactory factory):打开或创建(如果不存在)file文件所代表的SQLite数据库。
3)staticSQLiteDatabase
openOrCreateDatabase(String
path,SQLiteDatabase .CursorFactory factory):打开或创建(如果不存在)path文件所代表的SQLite数据库。
3.操作SQLiteDatabase 的方法主要有:
1)execSQL(Stringsql, Object[]
bindArgs):执行带占位符的 SQL语句。
2)execSQL(String
sql):执行 SQL语句。
3)insert(Stringtable, String
nullColumnHack,ContentValues values):向执行表中插入数据。
4)update(Stringtable, ContentValues
values, String whereClause, String[]
whereArgs):吏新指定表中的特定数据。
5)delete(Stringtable, String whereClause, String[] whareArgs):删除指定表中的特定数据。
6)Cursorquery(String table, String[]columns, String selection, String[] selection Args,String groupBy,
String having,String orderBy):对执行数据表执行査询。
7)Cursorquery(String table, String[] columns, String selection, String[] selectionArgs,String groupBy,
String having, String orderBy, String limit}:对执行数据表执行査询。Limit参数控制最多査询几条记录(用于控制分页的参数)。
8)Cursorquery(boolean distinct, String table, String[] columns, String selection,String[] selectionArgs,
groupBy, String having, String
orderBy, String
对指定表执行査询语句。其中第一个参数控制是否去除重复值。
9)rawQuery(Stringsql, String[]
selectionArgs):执行带占位符的 SQL查询。
10)beginTransaction():开始事务。
11)endTransaction():结束事务。
从上面的方法不难看出,其实SQLiteDatabase的作用有点类似于JDBC的Connection接口,但SQLiteDatabase提供的方法更多:比如insert、update、delete、query等方法,其实这些方法完全可通过执行SQL语句来完成,但Android考虑到部分开发者对SQL语法不熟悉,所以提供这些方法帮助开发者以更简单的方式来操作数据表的数据。
4.操作Cursor
上面査询方法都是返回一个Cursor对象,Android中的Cursor类似干JDBC的ResultSet,
Cursor同样提供了如下方法来移动査询结果的记录指针。
1)move(int offset):将记录指针向上或向下移动指定的行数。offset为正数就向下移动;为负数就是向上移动。
2)booleanmoveToFirst():将记录指针移动到第一行,如果移动成功则返回true。
3)booleanmoveToLast():将记录指针移动到最后一行,如果移动成功则返回true。
4)booleanmoveToNext():将记录指针移动到下一行,如果移动成功则返回true。
5)booleanmoveToPosition(int position):将记录指针移动到指定的行,如果移动成功则返回true。
6)booleanmoveToPrevious():将记录指针移动到上一行,如果移动成功则返回true。
—旦将记录指针移动到指定行之后,接下来就可以调用Cursor的getXxx()方法获取该行的指定列的数据。
其实如果大家具有JDBC编程的经验,完全可以把SQLiteDatabase当成JDBC
:中Connection和Statement的混合体因为SQLiteDatabase 既代表了与数据库的连接,也可直接用于执行SQL操作;而Android中Cursor则可当成ResultSet,而且Cursor提供了更多便捷的方法来操作结果集。
5.创建数据库和表
前面已经讲到,使用SQLiteDatabase的静态方法即可打开或创建数据库,例如如下代码:
SQLiteDatabase.openOrCreateDatabase(“/mnt/db/temp.db3”,null);
上面的代码就用于打开或创建一个SQLite数据库,如果/mnt/db/目录下的temp.db3文件
(该文件就是一个数据库)存在,那么程序就是打开该数据库:如果该文件不存在,则上面的代码将会在该目录下创建temp.db3文件(即对应于数据库)。
上面的代码中没有指定SQLiteDatabase.CursorFactory参数,该参数是一个用于返回
Cursor的工厂,如果指定该参数为null,则意味着使用默认的工厂。
上面的代码即可返回一个SQLiteDatabase对象,该对象的execSQL可执行任意的SQL语句。
通过如下代码在程序中创建数据表:
//定义建表语句
create tabletb_news(
id integer primarykey autoincrement,
title varchar(100)not null,
content varchar(2000));
在程序中执行上面的代码即可在数据库中创建一个数据表。
6.使用SQL语句操作SQLite数据库
正如前面提到的,SQLiteDatabase的execSQL方法可执行任意SQL语句,包括带占位符的SQL语句。但由于该方法没有返回值,一般用于执行DDL语句或DML语句;如果需要执行査询语句,则可调用SQLiteDatabase
的 rawQuery(String sql,String[]
selectionArgs)方法。例如如下代码可用于执行DML语句,
//执行插入语句
String sql ="insert into tb_news(title,content,publishDate)values(?,?,?)";
db.execSQL(sql,new
Object[]{news.getTitle(),news.getContent(),news.getPublishDate()});
提示:SQLite允许把各种类型的数据保存到任何类型字段中,开发者可以不用关心声明该字段所使用的数据类型。例如程序可以把字符串类型的值存INTEGER类型的字段中,也可以把数值类型的值存入布尔类型的字段中……但有一种情况例外:定义为INTEGERPRIMARY
KEY的字段只能存储64位整数,当向这种字段保存除整数以外的其他类型的数据时,SQLite会产生错误。
由于SQLite允许存入数据时忽略底层数据列实际的数据类型,因此在编写建表语句时可以柯略数据列后面的类型声明,例如如下SQL语句对于SQLite也是正确的。
create table my_test
(_id integer primary key autoincrement,
7.使用Android数据库操作的操作数据库
Android的SQLiteDatabase
提供了 insert、upate、delete或
query 语句来操作数据库。
1.使用insert方法插入记录
SQLiteDatabase 的 insert方法的签名为
longinsert (String table, String nullColumnHack, ContentValuesvalues),这个插入方法的参数说明如下。
table:代表想插入数据的表名。
nullColumnHack:代表强行插入null值的数据列的列名。
values:代表一行记录的数据。
insert方法插入的一行记录使用ComentValues存放,ContentValues类似于Map,它提供了
put其中key为数据列的列名,该方法用于存入数据、getAsXxx(String key)方法用于取出数据。
例如如下语句:
ContentValues values = new ContentValues();
values.put ("name” , “孙悟空”);
values.put(“age”, 500);
//返回新添记录的行号,该行号是一个内部值,与主键1^1无关,发生铕误返回一1
long rowid = db.insert("person_in”,null,values);
不管第三个参数是否包含数据,执行insert()方法总会添加一条记录,如果第三个参数为空,会添加一条除主键之外其他宇段值都为null的记录。
insert()方法的底层实际上依然是通过构造insert SQL语句来进行插入的,因此它生成的 SQL语句总是形如下面的语句:
//ContentValue 里 key-value对的数值决定了下面的key-value对.
insert into (key1,key 2...) values(valuel , value2 ...)
此时如果第三个参数为null或其中key-value对的数量为0,由于insert方法还会按此方式生成一条insert语句,此时的insert语句为:
insert into ()values()
上面的SQL语句显然有问题,为了满足SQL语法的需要,insert语句必须给定一个列名,如:insert
intoperson(name)values(null),这个name列名就由第二个参数来指定。由此可见,当ComentValues为null或它包含的key-value对的数量为()时,第二个参数就会起作用了。
一般来说,第二个参数指定的列名不应该是主键列的列名,也不应该是非空列的列名,否则强行往这些数据列插入nul会引发异常。
2.使用update方法更新记录
SQLiteDatabase 的 update方法的签名为update(String
table, ContentValues values, String whereClause, String[]whereArs),这个更新方法的参数说明如下:
table:代表想更新数据的表名。
values:代表想更新的数据。
whereClause:满足该whereClause子句的记录将会被更新。
whereArgs:用于为whereClause子句传入参数。
该方法返回受此update语句影响的记录的条数。
ContentValues values=new
ContentValues();
values.put("title",
news.getTitle());
values.put("content",
news.getContent());
db.update("tb_news",
values, "id=?",new
String[]{String.valueOf(news.getId())});
3.使用delete方法删除记录
SQLiteDatabase 的 delete方法的签名为delete(String
table , String whereClause, String[]whereArgs),这个删除的参数说明如下。
table:代表想删除数据的表名。
whereClause:满足该whereClause子句的记录将会被删除。
whereArgs:用于为whereClause子句传入参数。
该方法返回受此delete语句影响的记录的条数。
db=helper.getWritableDatabase();
db.execSQL("delete
from tb_news where id=?",new String[]{String.valueOf(newsId)});
使用query方法查询记录
SQLiteDatabase 的 query方法的签名为
Cursorquery(boolean distinct, String table,String[]
columns, String selection, Stringl]selecrionArgs, String groupBy, String having. String orderBy, String limit),这个query方法的参数说明如下,
distinct:指定是否去除重复记录,
table:执行査询数据的表名。
columns:要査询出来的列名。相当于select语句select关键字后面的部分s
selection:査询条件子句,相当于select语句where关键字后面的部分,在条件子
句中允许使用占位符。
selectionArgs:用于为selection子句中占位符传入参数值,值在数组中的位置与占位符在语句中的位置必须一致,否则就会有异常。
groupBy:用于控制分组?相当于select语句group
by关键字后面的部分
having:用于对分组进行过滤。相当于select语句having关键字后面的部分
orderBy:用于对记录进行排序。相当于select语句order
by关键字后面的部分,如:personid desc,
limit:用于进行分页,相当于select语句limit关键字后面的部分。
*获取分页数据
currentPage当前页码
pageSize每页显示的数据量
public List getNewsByPage(int
currentPage,int pageSize) {
db=helper.getReadableDatabase();
Listlist=newArrayList();
String start=String.valueOf((currentPage-1)*pageSize);
Cursor cursor=db.query(true,"tb_news",null,null,null,null,null,"id
asc",start+","+String.valueOf(pageSize));
sql="select* from tb_news order by id asc limit ?,?";
Cursorcursor=db.rawQuery(sql, new String[]{start,String.valueOf(pageSize)});
while(cursor.moveToNext()){
intid=cursor.getInt(cursor.getColumnIndex("id"));
Stringtitle=cursor.getString(cursor.getColumnIndex("title"));
Stringcontent=cursor.getString(cursor.getColumnIndex("content"));
StringdateString=cursor.getString(cursor.getColumnIndex("publishDate"));
Date publishDate=null;
publishDate= Utils.convertStr2Date(dateString);
catch (ParseException e) {
TODO Auto-generated catch block
e.printStackTrace();
list.add(new
News(id, title,content, publishDate));
SQLiteDatabase中包含如下两个方法来控制事务。
beginTransaction():开始事务。
endTransaction():结束事务。
除此之外,SQLileDatabase还提供了如下方法来判断当前上下文是否处于事务环境中》
inTransaction():如果当前上下文处于事务中,则返回true:否则返回false。
当程序执行endTiansaction()方法时将会结束事务——那到底是提交事务呢,还是回滚事务呢?这取决于SQLiteDatabase是否调用了
setTransactionSuccessful()方法来设置事务标志,
如果程序事务执行中调用该方法设置了事务成功则提交事务,否则程序将会回滾事务。示例代码如下:
//事务处理
publicvoid
tran(int id1,int
id2,int des){
SQLiteDatabase db
=helper.getWritableDatabase();
//按照这个语法格式写事务
db.beginTransaction();//开始事务
db.execSQL("update
tb_news set account=account - ? whereid=?",new
Integer[]{des,id1});
inti = 1 / 0;
db.execSQL("update
tb_news set account=account + ? whereid=?",new
Integer[]{des,id2});
db.setTransactionSuccessful();//设置事务成功标志
db.endTransaction();//结束事务:看事务是否成功,如果则提交,如果失败则回滚
9.SQLiteOpenHelper
SQLiteOpenHelper是Android提供的一个管理数据库的工具类,可用于管理数据库的创建和版木更新。一般的用法是创建SQLiteOpenHelper的子类,并扩展它的onCreate
(SQLiteDatabasedb)和 onUpgrade (SQLiteDatabasedb,intoldVersion,intnewVersion)方法。
SQLiteOpenHelper包含如下常用的方法。
synchronized SQLiteDatabase
getReadableDatabase():以读写的方式打开数据库对应的SQLiteDatabase对象。
synchronized SQLiteDatabase
getWritableDatabase():以写的方式打开数据库对应的
SQLiteDatabase 对象。
abstract void onCreate (SQLiteDatabase db):当第一次创建数据库时回调该方法。
abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion):当数据库版本更新时回调该方法。
synchronized void close():关闭所有打开的SQLiteDatabase
从上面的方法介绍中不难看出,SQLiteOpenHelper提供了getReadableDatabase()、
getWritableDatabase()两个方法用于打开数据库连接,并提供了close方法来关闭数据库连接,而开发者需要做的就是重写它的两个抽象方法。
onCreate (SQLiteDatabase db):
用于初次使用软件时生成数据库表,当调用SQLiteOpenHelper的 getWritableDatabase()或者
getReadableDalabase()方法获取用于操作数据库的SQLiteDatabase实例时,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreateO方法,onCreateO方法在初次生成数据库时才会被调用,在onCreateO方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion):
用于升级软件时更新数据库表结构,方法在数据库的版本发生变化时会被调用,该方法调用时oldVersion代表数据库之前的版本号,newVersion代表当前数据库当前的版本号。那么在哪里指定数据库的版本号呢?当程序创建SQLiteOpenHelper对象时,必须指定一个version参数,该参数就决定了所使用的数据库的版本——也就是说,数据库的版本是由程序员控制的。只要某次创建
SQLiteOpenHdper时指定的数据库版本号高于之前指定的版本号,系统就会自动触发 onUpgrade(SQLiteDatabase db, int oldVersion, int new Version)方法,程序就可以在onUpgrade()方法里面根据原版号和目标版本号进行判断,即可根据版本号进行必需的表结构更新。
提示:实际上,当应用程序升级表结构时,完全可能因为已有的数据导致升级失败,在这种时候程序可能需要先对数据进行转姑,清空数据表中的记录,接着对数据!表进行更新,当教据表更新完成后再将教据保存回来。
一旦得到了SQLiteOpenHelper对象之后,程序无须使用SQLiteDatabase的静态方法创建SQLiteDatabase 实例,而且可以使用getWritableDatabase()或
getReadableDatabase()方法来获取一个用于操作数据库的SQLiteDatabase实例。
其中getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。
getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失敗后会继续尝试以只读方式打开数据库。
请尊重他人的劳动成果,转载请注明出处:Android开发之SQLite数据库详解
http://blog.csdn.net/fengyuzhengfan/article/details/
相关搜索:
相关阅读:
相关频道:
Android教程最近更新程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Android研究院之游戏开发数据库SQLite (八)
Android研究院之游戏开发数据库SQLite (八)
围观5304次
编辑日期: 字体:
数据库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()就可以直接拿到这个静态对象。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546
public class DatabaseHelper extends SQLiteOpenHelper {&&&&private static DatabaseHelper mInstance = null;&&&&&/** 数据库名称 **/&&&&public static final String DATABASE_NAME = "xys.db";&&&&&/** 数据库版本号 **/&&&&private static final int DATABASE_VERSION = 1;&&&&&/**数据库SQL语句 添加一个表**/&&&&private static final String NAME_TABLE_CREATE = "create table test(" &&&&+ "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,"+"hp INTEGER DEFAULT 100,"+ "mp INTEGER DEFAULT 100," &&&&+ "number INTEGER);";&&&&&DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION);&&&&}&&&&& /**单例模式**/&&&&static synchronized DatabaseHelper getInstance(Context context) { if (mInstance == null) { &&&&mInstance = new DatabaseHelper(context); } return mInstance;&&&&}&&&&&@Override&&&&public void onCreate(SQLiteDatabase db) { /**向数据中添加表**/ db.execSQL(NAME_TABLE_CREATE);&&&&}&&&&&@Override&&&&public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { /**可以拿到当前数据库的版本信息 与之前数据库的版本信息&& 用来更新数据库**/&&&&}&&&&&/**&&&& * 删除数据库&&&& * @param context&&&& * @return&&&& */&&&&public boolean deleteDatabase(Context context) { return context.deleteDatabase(DATABASE_NAME);&&&&}}
在这个类中使用DatabaseHelper对象 实现创建与删除数据库、
123456789101112131415161718192021222324252627282930313233343536373839404142
public class NewSQLite extends Activity {&&&&DatabaseHelper mDbHelper = null;&&&&SQLiteDatabase mDb = null;&&&&Context mContext = null;&&&&@Override&&&&protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.create_sql); mContext = this; //创建DatabaseHelper对象 mDbHelper = DatabaseHelper.getInstance(mContext); //调用getReadableDatabase方法如果数据库不存在 则创建&&如果存在则打开 mDb= mDbHelper.getReadableDatabase();&&& Button button0 = (Button)findViewById(R.id.createDateBase); button0.setOnClickListener(new OnClickListener() {& &&&&@Override &&&&public void onClick(View arg0) {&
Toast.makeText(NewSQLite.this, "成功创建数据库", Toast.LENGTH_LONG).show(); &&&&} }); Button button1 = (Button)findViewById(R.id.deleteDateBase); button1.setOnClickListener(new OnClickListener() {& &&&&@Override &&&&public void onClick(View arg0) {
mDbHelper = DatabaseHelper.getInstance(mContext);
// 调用getReadableDatabase方法如果数据库不存在 则创建 如果存在则打开
mDb = mDbHelper.getReadableDatabase();
// 关闭数据库
mDbHelper.close();
// 删除数据库
mDbHelper.deleteDatabase(mContext);
Toast.makeText(NewSQLite.this, "成功删除数据库", Toast.LENGTH_LONG).show(); &&&&} });& super.onCreate(savedInstanceState);&&&&}&}
创建的数据库会被保存在当前项目中 databases 路径下 具体如图所示
添加与删除数据库中的表
数据库是可以由多张数据表组成的 如果添加一张数据库的表的话 可以使用 数据库语句 create table 名称(内容) 来进行添加 。这里给出一条创建数据库的语句 。 意思是创建一张表 名称为gameInfo 表中包含的字段 为
为INTEGER 类型 并且递增
name 为Text类型
hp mp 为INTEGER 默认数值为100 number 为INTEGER 类型。
&&&&/**创建一张表的SQL语句**/&&&&private static final String NAME_TABLE_CREATE = "create table gameInfo(" &&&&+ "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,"+ "hp INTEGER DEFAULT 100,"+ "mp INTEGER DEFAULT 100," &&&&+ "number INTEGER);";
数据库中删除一张表 直接使用DROP TABLE
表名称 就可以删除
&&&&/**删除一张表的SQL语句**/&&&&private static final String NAME_TABLE_DELETE = "DROP TABLE gameInfo";
在代码中去执行一条SQL语句 使用SQLiteDatabase对象去调用execSQL() 传入SQL语句就OK了。
mDb.execSQL(NAME_TABLE_CREATE);
以创建一张名称为gameInfo的表为例 给出代码实现
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
public class NewTable extends Activity {&&&&DatabaseHelper mDbHelper = null;&&&&SQLiteDatabase mDb = null;&&&&Context mContext = null;&&&&&/**创建一张表的SQL语句**/&&&&private static final String NAME_TABLE_CREATE = "create table gameInfo(" &&&&+ "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,"+ "hp INTEGER DEFAULT 100,"+ "mp INTEGER DEFAULT 100," &&&&+ "number INTEGER);";&&&&&/**删除一张表的SQL语句**/&&&&private static final String NAME_TABLE_DELETE = "DROP TABLE gameInfo";&&&&&@Override&&&&protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.create_table); mContext = this; mDbHelper = DatabaseHelper.getInstance(mContext); mDb= mDbHelper.getReadableDatabase();&&& Button button0 = (Button)findViewById(R.id.createTable); button0.setOnClickListener(new OnClickListener() {& &&&&@Override &&&&public void onClick(View arg0) {
&&&&mDb.execSQL(NAME_TABLE_CREATE);
&&&&Toast.makeText(NewTable.this, "成功添加数据表", Toast.LENGTH_LONG).show();
}catch(SQLiteException e) {
&&&&Toast.makeText(NewTable.this, "数据库中已存此表", Toast.LENGTH_LONG).show();
} &&&&} }); Button button1 = (Button)findViewById(R.id.deleteTable); button1.setOnClickListener(new OnClickListener() {& &&&&@Override &&&&public void onClick(View arg0) {
&&&&mDb.execSQL(NAME_TABLE_DELETE);
&&&&Toast.makeText(NewTable.this, "成功删除数据表", Toast.LENGTH_LONG).show();
}catch(SQLiteException e) {
&&&&Toast.makeText(NewTable.this, "数据库中已无此表", Toast.LENGTH_LONG).show();
}& &&&&} });& super.onCreate(savedInstanceState);&&&&}&}
增加 删除 修改 查询 数据库中的数据
使用SQLiteDatabase对象调用 insert()方法 传入标的名称与ContentValues 添加的内容 则可以向数据库表中写入一条数据 delete ()为删除一条数据 update()为更新一条数据。
我详细说一下查找一条数据使用的方法 query 中 跟了8个参数
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);
参数说明:
table:数据库表的名称
columns:数据库列名称数组 写入后最后返回的Cursor中只能查到这里的列的内容
selection:查询条件
selectionArgs:查询结果
groupBy:分组列
having:分组条件
orderBy:排序列
limit:分页查询限制
Cursor:返回值,将查询到的结果都存在Cursor
Cursor是一个游标接口,每次查询的结果都会保存在Cursor中 可以通过遍历Cursor的方法拿到当前查询到的所有信息。
Cursor的方法
moveToFirst() //将Curor的游标移动到第一条
moveToLast()///将Curor的游标移动到最后一条
move(int offset)//将Curor的游标移动到指定ID
moveToNext()//将Curor的游标移动到下一条
moveToPrevious()//将Curor的游标移动到上一条
getCount() //得到Cursor 总记录条数
isFirst() //判断当前游标是否为第一条记录
isLast()//判断当前游标是否为最后一条数据
getInt(int columnIndex)
//根据列名称获得列索引ID
getString(int columnIndex)//根据索引ID 拿到表中存的字段
这里给出一个例子遍历Cursor的例子
12345678910111213141516
&&&&private void query(SQLiteDatabase db) { // 把整张表的所有数据query到cursor中 Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null); //判断cursor不为空 这个很重要 if (cursor != null) { &&&&// 循环遍历cursor &&&&while (cursor.moveToNext()) {
// 拿到每一行name 与hp的数值
String name = cursor.getString(cursor.getColumnIndex("name"));
String hp = cursor.getString(cursor.getColumnIndex("hp"));
Log.v("info", "姓名是 " + name + "hp为 " + hp); &&&&} &&&&// 关闭 &&&&cursor.close(); }&&&&}
向大家推荐一个查看数据库的软件非常好用, 名称是SQLiteSpy.exe
如图所示 打开xys.db 文件 可以清晰的看见数据库表中储存的内容并且该软件支持执行SQL语句 可以直接在软件中操作,我给出这款软件的下载地址。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
public class Newdate extends Activity {&&&&DatabaseHelper mDbHelper = null;&&&&SQLiteDatabase mDb = null;&&&&Context mContext = null;&&&&&/** 数据库字段 **/&&&&&public final static String TABLE_NAME = "test";&&&&public final static String ID = "_id";&&&&public final static String NAME = "name";&&&&public final static String HP = "hp";&&&&public final static String MP = "mp";&&&&&@Override&&&&protected void onCreate(Bundle savedInstanceState) { setContentView(R.layout.create_date); mContext = this; // 创建DatabaseHelper对象 mDbHelper = DatabaseHelper.getInstance(mContext); // 调用getReadableDatabase方法如果数据库不存在 则创建 如果存在则打开 mDb = mDbHelper.getReadableDatabase(); // 初始化 给数据库表写入一些信息 for (int i = 0; i & 10; i++) { &&&&insert(NAME, "雨松MOMO" + i); }& // 增加 Button button0 = (Button) findViewById(R.id.add); button0.setOnClickListener(new OnClickListener() {& &&&&@Override &&&&public void onClick(View arg0) {
insert(NAME, "新添加小可爱");
Toast.makeText(Newdate.this, "添加一条数据名称为小可爱", Toast.LENGTH_LONG)
.show(); &&&&} }); // 删除 Button button1 = (Button) findViewById(R.id.delete); button1.setOnClickListener(new OnClickListener() {& &&&&@Override &&&&public void onClick(View arg0) {
delete(ID, "1");
Toast.makeText(Newdate.this, "删除一条_id=1的数据", Toast.LENGTH_LONG)
.show(); &&&&} }); // 修改 Button button2 = (Button) findViewById(R.id.modify); button2.setOnClickListener(new OnClickListener() {& &&&&@Override &&&&public void onClick(View arg0) {
update(NAME, "雨松MOMO3", "小可爱3");
Toast.makeText(Newdate.this, "更新名称雨松MOMO3 为小可爱3",
Toast.LENGTH_LONG).show(); &&&&} }); // 查找 Button button3 = (Button) findViewById(R.id.find); button3.setOnClickListener(new OnClickListener() {& &&&&@Override &&&&public void onClick(View arg0) {
Cursor cursor = find(ID, "5");
String name = cursor.getString(cursor.getColumnIndex(NAME));
Toast.makeText(Newdate.this, "查找ID为5数据的名称是 " + name,
Toast.LENGTH_LONG).show(); &&&&} }); super.onCreate(savedInstanceState);&&&&}&&&&&/**&&&& * 插入一条数据&&&& *&&&& * @param key&&&& * @param date&&&& */&&&&public void insert(String key, String date) { ContentValues values = new ContentValues(); values.put(key, date); mDb.insert(TABLE_NAME, null, values);&&&&}&&&&&/**&&&& * 删除一掉数据&&&& *&&&& * @param key&&&& * @param date&&&& */&&&&public void delete(String key, String date) { mDb.delete(TABLE_NAME, key + "=?", new String[] { date });&&&&}&&&&&/**&&&& * 更新一条数据&&&& *&&&& * @param key&&&& * @param oldDate&&&& * @param newDate&&&& */&&&&public void update(String key, String oldDate, String newDate) { ContentValues values = new ContentValues(); values.put(key, newDate); mDb.update(TABLE_NAME, values, key + "=?", new String[] { oldDate });&&&&}&&&&&/**&&&& * 查找一条数据&&&& *&&&& * @param key&&&& * @param date&&&& * @return&&&& */&&&&public Cursor find(String key, String date) {& Cursor cursor = mDb.query(TABLE_NAME, null, key + "=?",
new String[] { date }, null, null, null); if (cursor != null) { &&&&cursor.moveToFirst(); } return cursor;&&&&}&}
这里我在强调一下query中的第二个参数String [] columns , 举个例子 当前在数据中query 数值 如果我只想要数据中符合条件数据每一行的name字段和hp 字段 那么第二个参数就不要写成null了。
第二个参数我写成了new String[] {“name”,”hp”} 这样的话得到的Cursor 中的数据只会存有 数据库表中”name ” 与 “hp”两个字段 因为其它字段我们根本不需要所以着么写可以大大提高代码的效率。如果写成null的话 Cursor 中的数据就会把数据库表中所以的字段都保存进去这样在计算Cursor 的时候代码就会消耗更多没用的时间。
cursor.getString(0); 的意思就是拿到对应new String[] {“name”,”hp”} 数组中的一个字段的内容 意思就是拿到 数据库字段”name”的值, cursor.getString(1);的意思就是拿到数据库字段”hp”的值 。cursor.getString()中的ID 是完全对应第二个参数String [] columns数组角标。
12345678910
&&&&public void find() { Cursor cursor = mDb.query(TABLE_NAME, new String[] {"name","hp"}, null,
null, null, null, null); while(cursor.moveToNext()) { &&&&String name = cursor.getString(0); &&&&String hp = cursor.getString(1); &&&&Log.v("info", "name is "+name); &&&&Log.v("info", "hp is "+hp); }&&&&}
最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习雨松MOMO希望可以和大家一起进步。
下载地址:
本文固定链接:
转载请注明:
MOMO与MO嫂提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!

我要回帖

更多关于 ios 查看sqlite数据库 的文章

 

随机推荐