当前位置:文档之家› android中的数据库操作

android中的数据库操作

android中的数据库操作
android中的数据库操作

android中的数据库操作

android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作。

一、android内的数据库的基础知识介绍

1.用了什么数据库

android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用c 语言构建的。相关简介可以从链接查看。

2.数据库基本知识观花

对于一些和我一样还没有真正系统学习数据库技术的同学来说,把SQL92标准中的一些基本概念、基本语句快速的了解一下,是很有必要的,这样待会用Android的database相关方法去执行一些数据库语句时就不会茫然了。

①数据库的基本结构——表格

表格是数据库中储存资料的基本架构。表格被分为栏位(column) 及列位(row)。每一列代表一笔资料,而每一栏代表一笔资料的一部份。举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日...等等。每一个表格拥有一个独一无二的名字(Table Name)以便能够让用户定位到它上面。一个典型的表格结构如下:

Store_Information 表格

store_name Sales Date

Los Angeles $1500 Jan-05-1999

San Diego $250 Jan-07-1999

Los Angeles $300 Jan-08-1999

Boston $700 Jan-08-1999

该表格的表格名字为Store_Information,一共有三个栏位,分别为store_name , Sales , Data ,已经录入了四笔数据所以有四个列位。

②关于数据类型

和其他的数据库不同的是,sqlite是无类型的。也就是当你创建一个表格时,无需对每一个栏位要存储的数据的类型进行声明,当你在给表格增加数据条目时,sqlite会自动找到存入的数据的类型。

SQLite允许忽略数据类型,但是,仍然建议在Create Table语句中指定数据类型,因为数据类型有利于增强程序的可读性。SQLite支持常见的数据类型,如V ARCHAR、NV ARCHAR、TEXT、INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、V ARYING、CHARACTER、NATl0NAI, V ARYINGCHARACTER。这些数据类型都是SQL92标准中规定的标准数据库数据类型,想要有更近一步了解,请参看下表。

SQL数据库数据类型详解

数据类型类型描述

bit 整型bit 数据类型是整型,其值只能是0、1或空值。这种数据类型用于存储只有两种可能值的数据,如Yes 或No、True 或Fa lse 、On 或Off

int 整型int 数据类型可以存储从- 231(-2147483648)到231 (2147483 647)之间的整数。存储到数据库的几乎所有数值型的数据都可以用这种数据类型。这种数据类型在数据库里占用4个字节

smallint 整型smallint 数据类型可以存储从- 215(-32768)到215(32767)之间的整数。这种数据类型对存储一些常限定在特定范围内的数值型数据非常有用。这种数据类型在数据库里占用2 字节空间

tinyint 整型tinyint 数据类型能存储从0到255 之间的整数。它在你只打算存储有限数目的数值时很有用。这种数据类型在数据库中占用1 个字节

numeric 精确数值型numeric数据类型与decimal 型相同

decimal 精确数值型decimal 数据类型能用来存储从-1038-1到1038-1的固定精度和范围的数值型数据。使用这种数据类型时,必须指定范围和精度。范围是小数点左右所能存储

的数字的总位数。精度是小数点右边存储的数字的位数

money 货币型money 数据类型用来表示钱和货币值。这种数据类型能存储从-9220亿到9220 亿之间的数据,精确到货币单位的万分之一

smallmoney 货币型smallmoney 数据类型用来表示钱和货币值。这种数据类型能存储从-214748.3648 到214748.3647 之间的数据,精确到货币单位的万分之一

float 近似数值型float 数据类型是一种近似数值类型,供浮点数使用。说浮点数是近似的,是因为在其范围内不是所有的数都能精确表示。浮点数可以是从-1.79E+308到1.79E+308 之间的任意数

real 近似数值型real 数据类型像浮点数一样,是近似数值类型。它可以表示数值在-3.40E+38到3.40E+38之间的浮点数

datetime 日期时间型datetime数据类型用来表示日期和时间。这种数据类型存储从1753年1月1日到9999年12月3 1日间所有的日期和时间数据,精确到三百分之一秒或3.33毫秒

Smalldatetime 日期时间型smalldatetime 数据类型用来表示从1900年1月1日到2079年6月6日间的日期和时间,精确到一分钟

cursor 特殊数据型cursor 数据类型是一种特殊的数据类型,它包含一个对游标的引用。这种数据类型用在存储过程中,而且创建表时不能用

timestamp 特殊数据型timestamp 数据类型是一种特殊的数据类型,用来创建一个数据库范围内的唯一数码。一个表中只能有一个timestamp列。每次插入或修改一行时,timestamp 列的值都会改变。尽管它的名字中有“time”,但timestamp列不是人们可识别的日期。在一个数据库里,timestamp值是唯一的

Uniqueidentifier 特殊数据型Uniqueidentifier数据类型用来存储一个全局唯一标识符,即GUID。GUID确实是全局唯一的。这个数几乎没有机会在另一个系统中被重建。可以使用NEWID 函数或转换一个字符串为唯一标识符来初始化具有唯一标识符的列

char 字符型char数据类型用来存储指定长度的定长非统一编码型的数据。当定义一列为此类型时,你必须指定列长。当你总能知道要存储的数据的长度时,此数据类型很有用。例如,当你按邮政编码加4个字符格式来存储数据时,你知道总要用到10个字符。此数据类型的列宽最大为8000 个字符

varchar 字符型varchar数据类型,同char类型一样,用来存储非统一编码型字符数据。与char 型不一样,此数据类型为变长。当定义一列为该数据类型时,你要指定该列的最大长度。它与char数据类型最大的区别是,存储的长度不是列长,而是数据的长度

text 字符型text 数据类型用来存储大量的非统一编码型字符数据。这种数据类型最多可以有231-1或20亿个字符

nchar 统一编码字符型nchar 数据类型用来存储定长统一编码字符型数据。统一编码用双字节结构来存储每个字符,而不是用单字节(普通文本中的情况)。它允许大量的扩展字符。此数据类型能存储4000种字符,使用的字节空间上增加了一倍

nvarchar 统一编码字符型nvarchar 数据类型用作变长的统一编码字符型数据。此数据类型能存储4000种字符,使用的字节空间增加了一倍

ntext 统一编码字符型ntext 数据类型用来存储大量的统一编码字符型数据。这种数据类型能存储230 -1或将近10亿个字符,且使用的字节空间增加了一倍

binary 二进制数据类型binary数据类型用来存储可达8000 字节长的定长的二进制数据。当输入表的内容接近相同的长度时,你应该使用这种数据类型

varbinary 二进制数据类型varbinary 数据类型用来存储可达8000 字节长的变长的二进制数据。当输入表的内容大小可变时,你应该使用这种数据类型

image 二进制数据类型image 数据类型用来存储变长的二进制数据,最大可达231-1或大约20亿字节

你或许已经在纳闷了,为什么之前的数据类型是大写的,而到了这个表格就变成了小写的。其实这是sqlite的一个不得不提的特性:sqlite是大小写不敏感的!这一特性对于很多c语言fans来说是很不习惯的。

③数据库的基本操作语句

其实这个还是SQL92标准中的一部分,只是不同的数据库会有一点点的不同而已,下面就对在android中最常用的几个操作语句给以概述,详细介绍请参看SQL语句简单介绍。

(1)CREATE TABLE

由于创建一个表格,基本使用语法结构是:

CREATE TABLE "表格名" ("栏位1" 保存资料类型, "栏位3" 保存资料类型, "栏位2" 保存资料类型.....);

例如我要创建刚才的Store_Information表格,就可以这样:

CREATE TABLE Store_Information (Store_Name char[50] , Sales long , Date date );

需要提示的是,这里还是声明了数据类型。而且不难发现,c语言构建的sqlite自身也有一些c语言的性格(例如一个完整语句后的分号)。

(2)SELECT

用于将资料从数据库中的表格内选出,基本语法结构为:

SELECT "栏位名" FROM "表格名" ;

例如我想将Store_Information 里面的store_name 选出,则可以这样:SELECT store_name FROM Store_Information ;

这句执行后就会显示如下的信息:

store_name

Los Angeles

San Diego

Los Angeles

Boston

好了,效果一目了然。

(3)SELECT语句可以添加条件来缩小选择结果:

去掉重复的结果:

SELECT DISTINCT "栏位名" FROM "表格名"

例如将刚才的语句改为:

SELECT DISTINCT store_name FROM Store_Information ;

则显示的结果为:

store_name Los Angeles San Diego Boston

实现有条件的筛选:

SELECT "栏位名" FROM "表格名" WHERE "条件语句" ;

条件语句和c语言中的类似,只不过用AND表示“且”,OR表示“或”。

例如对表执行如下语句:

SELECT store_name FROM Store_Information WHERE Sales > 1000 ;

则显示结果为:

store_name

Los Angeles

其中WHERE语句用的较多,因为它可以实现自定义条件的使用和多条件的组合。

(4)INSERT INTO

在表格中加入资料——可以实现一笔的加入和多笔的加入。

加入一笔:

INSERT INTO "表格名" ("栏位1", "栏位2", ...) V ALUES ("值1", "值2", ...);

加入多笔:

INSERT INTO "待加入数据的表格" ("栏位1", "栏位2", ...) SELECT "栏位3", "栏位4", ... FROM "被加入的表格" ;

加入多笔其实就是将另一个表格加入到现有表格中。

(5)UPDA TE

用于修改表格中的数据,语法结构为:

UPDATE "表格名" SET "栏位1" = [新值] WHERE {条件};

例如:

UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date = "Jan-08-1999" ;

具体是什么意思的话就不说了,你懂的~~~

(6)DELETE FROM

删除表格中的某些数据,语法结构为:

DELETE FROM "表格名" WHERE {条件} ;

满足条件的所有资料都会被删除掉。

二、如何在android中调用数据库资源

在android中主要有两种方法来实现对数据库的访问,一种是adb shell方式,另一种是通过相关的android 的java类来间接的对数据库来进行操作。其中前者主要用于在开发过程中进行调试等工作,后者则为android中主要的使用数据库的方式。

下面就对这两种方式进行一个简要的介绍。

1.adb shell方式

说白了,adb shell 就是一个android模拟器的后台资源调用器(个人理解啦~~)。它的操作方式和命令提示符差不多——以命令行的方式进行。

既然是模拟器的后台资源调用器,那当然得先打开android模拟器了。

打开模拟器后,再打开命令提示符,在里面输入adb shell,这时会出现一个#号(懂linux的同学懂的),具体效果如下:

然后你就可以像在linux下进行shell命令的执行了。

接着输入cd data/data/ 并执行,再执行ls,则会显示一些安装的软件的工程包名,效果如下:

其实这在模拟器中是以一个个文件夹的形式存在的,所以你可以用cd命令进入它。例如我进入一个后,再用ls命令显示里面的内容:

该文件夹内又存在databases、lib等文件夹(如果没有databases的话可以自己手动用mkdir 命令创建一个)。而这个databases文件夹就是这个应用的数据库文件的所在地,cd进入后,应该会看到里面有一个或多个.db格式的文件(其实sqlite对文件的名字没有特殊要求,你用.txt等其他的格式也可以,但推荐.db)。如果没有db文件的话,可以用如下命令创建:sqlite3 mydata.db。这样就会在databases里面生成了一个数据库文件。如果已存在,可以直接用sqlite3命令调用该数据库文件,命令为sqlite3 mydata.db(其实就是和刚才的命令一个样)。接下来你就会看到:

在sqlite>后面就可以执行你的sql语句了。下面执行了一些简单的语句:

好了,adb shell的方式介绍到这里。

2.通过android中的相关java类

Android中对数据库进行操作的相关的借口、类等都在andorid.database和android.database.sqlite两个包里面。里面存在着很多的与数据库操作相关的类,但是在平时普通的开发中最经常遇到的仅仅就是那几个类而已,所以在这里我就省去通篇的介绍,对一些常用的接口、类做一下简介。

①SQLiteDatabase(android.database.sqlite.SQLiteDatabase)

文档信息:

public class

SQLiteDatabase

Exposes methods to manage a SQLite database.SQLiteDatabase has methods to create, delete, execute SQLcommands, and perform other common database management tasks.atabase names must be unique within an application, not across all applications.

简介:

这个是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作。

重要方法介绍:

(1)public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)

public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)

这个方法用于打开或创建一个数据库(对于sqlite来说,就是打开或产生一个数据库文件),参数中的File类就是java中表示系统文件路径的File类,而SQLiteDatabase.CursorFactory 则是一个产生Cursor对象的工厂类(Cursor接口将在后面介绍到)。

(2)public long insert (String table, String nullColumnHack, ContentValues values)

看到它的名字以及sql中的相关语句你不难猜到这个方法用于在数据库中加入数据。ContentValue类似于java中HashMap类,用于以键值对的方式保存数据。

(3)public int delete (String table, String whereClause, String[] whereArgs)

不用说了,用于删除表中的数据。

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

名字很长是吧,它的功能也很强大,用于查询数据库中的数据。

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

用于修改数据。根据传入参数的名字可以对使用方法略知一二。

(6)public void execSQL (String sql, Object[] bindArgs)

public void execSQL (String sql)

这是我个人认为最为重要的方法。这个方法用于执行你用String表示的非查询(因为它不会返回一个Cursor对象)的sql语句,例如CREATE,SELECT等。遗憾的是现在尚无法一次调用该方法来执行用“;”分开的多条sql语句。第二个重写方法使用的更多些。

另外在此提问:第一个重写方法中bindArgs表示的是一些什么,用来做什么用,知道的同学可以告诉我下,谢谢!

(7)public void close ()

用来关闭数据库并释放数据库占用的相关资源。

②SQLiteOpenHelper (android.database.sqlite.SQLiteOpenHelper)

文档信息:

public abstract class

SQLiteOpenHelper

A helper class to manage database creation and version management. You create a subclass implementingonCreate(SQLiteDatabase), onUpgrade(SQLiteDatabase, int, int) and optionally onOpen(SQLiteDatabase), and this class takes care of opening the database if it exists, creating it if it does not, and upgrading it as necessary. Transactions are used to make sure the database is always in a sensible state.

简介:

正如它的名字所表述的一样,这个抽象类是一个辅助类(Helper),用来打开(若数据库已存在)或创建数据库的。关于抽象类我们都知道,如果要使用它,一定是继承它。所以使用它都是通过自己定义一个类继承于它,并实现onCreate(SQLiteDatabase) , onUpgrade(SQLiteDatabase, int, int) , onOpen(SQLiteDatabase)三个方法。

在我看来,所谓的辅助类,其实就是充当了一个封装器——也就是说用于对其辅助的类实现一个java上的封装。在这里,SQLiteOpenHelper就是用来对SQLiteDatabase进行一个封装处理。初学的同学想要进一步理解的话可以先看看什么是封装。

它包含的方法如下:

(1)synchronized void close()

关闭任何已开启的数据库对象。

(2)synchronized SQLiteDatabase getReadableDatabase()

创建或打开一个仅仅可读的(read-only)数据库。

(3)synchronized SQLiteDatabase getWritableDatabase()

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

(4)abstract void onCreate(SQLiteDatabase db)

当数据库被第一次创建时被调用的的方法(类似于Activity的onCreate())。

(5)void onOpen(SQLiteDatabase db)

数据库已经被成打开后被调用。

(6)abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

当数据库需要被更改(更新)时被调用。

③Cursor(android.database.Cursor)

文档信息:

public interface

Cursor

This interface provides random read-write access to the result set returned by a database query.

简介:

Cursor没有构造方法,只能通过query方法获得。

前面提到了,execSQL方法无法执行与查询相关的sql语句,是因为无法返回一个Cursor 对象——查询需要将查到的结果(就是表中的哪一行满足查询条件)返回,execSQL是返回void的,所以无法操作查询语句。从这里可以了解到,Cursor接口从某种意义上说就是为了弥补这一点的——query方法就是返回了一个Cursor对象。从名字上看,它的意思是游标,所以大概可以猜到他起到了一个指代的作用(事实上就是的,它指代数据库中保存数据的表的一行,并且还可以简单的处理该行数据项的信息)。从类的描述看,Cursor提供了对一个数据库查询动作返回结果束的随机读写途径,也就是说,它是一个对查询操作返回结果进行进一步处理的类,而这些处理就是用Cursor里的方法实现的。

结合SimpleCursorAdapter这个适配器类,你可以很方便的将数据库中的数据显示到AdapterView(例如ListView,GridView)中——这也是Cursor的另一大用处。

如果你了解java中的迭代器(Iterator)的话你就会发现其实Cursor和迭代器有些相似,这样你可能会更快的了解Cursor。

一些常用的方法有:

(1)public abstract boolean moveToPosition (int position)

public abstract boolean moveToFirst ()

public abstract boolean moveToLast ()

public abstract boolean moveToNext ()

public abstract boolean moveToPrevious ()

把这些方法放在一起的目的很明显:它们都是对Cursor指向的位置进行操作的方法——移到某个指定的位置、移到第一行、移到最后一行、移向下一行、移向上一行等等。

(2)public abstract int getCount ()

返回Cursor指向的表含有的总数据项数。

(3)public abstract boolean requery ()

Cursor是被一个query方法产生的,而这个方法就是将那个query方法所做的查询动作再执行一遍——这将会改变调用该方法的Cursor对象的值,也就是说,Cursor使用了该方法后就复位了。

(4)public abstract boolean isClosed ()

public abstract boolean isFirst ()

public abstract boolean isLast ()

public abstract boolean isNull (int columnIndex)

public abstract boolean isClosed ()

public abstract boolean isAfterLast ()

public abstract boolean isBeforeFirst ()

在java中,类似于isWhatever形式的方法大都是对对象状态进行判断的方法——Whatever 成立则返回true,不成立则返回false。这些方法也不例外。

值得提一下的是isNull方法,该方法测试某个栏位所保存的信息是否为NULL。参数columnIndex代表了那个栏位的代号。

④另外建议各位了解一下SimpleCursorAdapter(android.widget.SimpleCursorAdapter)这个适配器类。

好了,介绍这么多了,该上源码了。这个源码很简单,但代表一种使用模式,所以还是值得仔细研究的。

1.实现一个继承SQLiteOpenHelper的类

view plaincopy to clipboardprint?

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "coll.db";

private static final String TBL_NAME = "CollTbl";

private static final String CREATE_TBL = " create table "

+ " CollTbl(_id integer primary key autoincrement,name text,url text, desc text) ";

private SQLiteDatabase db;

DBHelper(Context c) {

super(c, DB_NAME, null, 2);

}

@Override

public void onCreate(SQLiteDatabase db) {

this.db = db;

db.execSQL(CREATE_TBL);

}

public void insert(ContentValues values) {

SQLiteDatabase db = getWritableDatabase();

db.insert(TBL_NAME, null, values);

db.close();

}

public Cursor query() {

SQLiteDatabase db = getWritableDatabase();

Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);

return c;

}

public void del(int id) {

if (db == null)

db = getWritableDatabase();

db.delete(TBL_NAME, "_id=?", new String[] { String.valueOf(id) });

}

public void close() {

if (db != null)

db.close();

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldV ersion, int newVersion) {

}

}

import android.content.ContentValues;

import android.content.Context;

import android.database.Cursor;

import android.database.sqlite.SQLiteDatabase;

import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

private static final String DB_NAME = "coll.db";

private static final String TBL_NAME = "CollTbl";

private static final String CREATE_TBL = " create table "

+ " CollTbl(_id integer primary key autoincrement,name text,url text, desc text) ";

private SQLiteDatabase db;

DBHelper(Context c) {

super(c, DB_NAME, null, 2);

}

@Override

public void onCreate(SQLiteDatabase db) {

this.db = db;

db.execSQL(CREATE_TBL);

}

public void insert(ContentValues values) {

SQLiteDatabase db = getWritableDatabase();

db.insert(TBL_NAME, null, values);

db.close();

}

public Cursor query() {

SQLiteDatabase db = getWritableDatabase();

Cursor c = db.query(TBL_NAME, null, null, null, null, null, null);

return c;

}

public void del(int id) {

if (db == null)

db = getWritableDatabase();

db.delete(TBL_NAME, "_id=?", new String[] { String.valueOf(id) });

}

public void close() {

if (db != null)

db.close();

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }

}

2.创建一个录入数据的类

view plaincopy to clipboardprint?

import android.app.Activity;

import android.content.ContentValues;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

public class AddActivity extends Activity {

private EditText et1, et2, et3;

private Button b1;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.doczj.com/doc/ac10928244.html,yout.add);

this.setTitle("添加收藏信息");

et1 = (EditText) findViewById(R.id.EditTextName);

et2 = (EditText) findViewById(R.id.EditTextUrl);

et3 = (EditText) findViewById(R.id.EditTextDesc);

b1 = (Button) findViewById(R.id.ButtonAdd);

b1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

String name = et1.getText().toString();

String url = et2.getText().toString();

String desc = et3.getText().toString();

ContentValues values = new ContentValues();

values.put("name", name);

values.put("url", url);

values.put("desc", desc);

DBHelper helper = new DBHelper(getApplicationContext());

helper.insert(values);

Intent intent = new Intent(AddActivity.this,

QueryActivity.class);

startActivity(intent);

}

});

}

}

import android.app.Activity;

import android.content.ContentValues;

import android.content.Intent;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.EditText;

public class AddActivity extends Activity {

private EditText et1, et2, et3;

private Button b1;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.doczj.com/doc/ac10928244.html,yout.add);

this.setTitle("添加收藏信息");

et1 = (EditText) findViewById(R.id.EditTextName);

et2 = (EditText) findViewById(R.id.EditTextUrl);

et3 = (EditText) findViewById(R.id.EditTextDesc);

b1 = (Button) findViewById(R.id.ButtonAdd);

b1.setOnClickListener(new OnClickListener() {

public void onClick(View v) {

String name = et1.getText().toString();

String url = et2.getText().toString();

String desc = et3.getText().toString();

ContentValues values = new ContentValues();

values.put("name", name);

values.put("url", url);

values.put("desc", desc);

DBHelper helper = new DBHelper(getApplicationContext());

helper.insert(values);

Intent intent = new Intent(AddActivity.this,

QueryActivity.class);

startActivity(intent);

}

});

}

}

3.创建一个显示数据库数据的类

view plaincopy to clipboardprint?

import android.app.AlertDialog;

import android.app.ListActivity;

import android.content.DialogInterface;

import android.database.Cursor;

import android.os.Bundle;

import android.view.View;

import android.widget.AdapterView;

import android.widget.ListView;

import android.widget.SimpleCursorAdapter;

import android.widget.AdapterView.OnItemClickListener;

public class QueryActivity extends ListActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

this.setTitle("浏览收藏信息");

final DBHelper helpter = new DBHelper(this);

Cursor c = helpter.query();

String[] from = { "_id", "name", "url", "desc" };

int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,

https://www.doczj.com/doc/ac10928244.html,yout.row, c, from, to);

ListView listView = getListView();

listView.setAdapter(adapter);

final AlertDialog.Builder builder = new AlertDialog.Builder(this);

listView.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView arg0, View arg1, int arg2,

long arg3) {

final long temp = arg3;

builder.setMessage("真的要删除该记录吗?").setPositiveButton("是",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,

int which) {

helpter.del((int)temp);

Cursor c = helpter.query();

String[] from = { "_id", "name", "url", "desc" };

int[] to = { R.id.text0, R.id.text1, R.id.text2, R.id.text3 };

SimpleCursorAdapter adapter = new SimpleCursorAdapter(getApplicationContext(),

https://www.doczj.com/doc/ac10928244.html,yout.row, c, from, to);

ListView listView = getListView();

listView.setAdapter(adapter);

}

}).setNegativeButton("否",

new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog,

int which) {

}

});

AlertDialog ad = builder.create();

ad.show();

}

});

helpter.close();

}

}

import android.app.AlertDialog;

import android.app.ListActivity;

import android.content.DialogInterface;

import android.database.Cursor;

安卓手机数据库连接代码

package com.fenghuo.firstproject; 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.widget.CursorAdapter; import android.widget.ListView; import android.widget.SimpleCursorAdapter; public class DataBaseActivity extends Activity { public static SQLiteDatabase db = null; private ListView listView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/ac10928244.html,yout.activity_data_base); SQLiteOpenHelper helper = new SQLiteOpenHelper(this,"mydb",null,1) { @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("drop table users"); onCreate(db); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE 'users' ( '_id' INTEGER NOT NULL, 'username' TEXT NOT NULL, 'password' TEXT NOT NULL, 'email' TEXT NOT NULL, PRIMARY KEY ('_id') ) "); db.execSQL("insert into users values(1,'admin','admin','admin@https://www.doczj.com/doc/ac10928244.html,')"); db.execSQL("insert into users values(2,'admin1','admin','admin1@https://www.doczj.com/doc/ac10928244.html,')"); db.execSQL("insert into users values(3,'admin2','admin','admin2@https://www.doczj.com/doc/ac10928244.html,')"); db.execSQL("insert into users values(4,'admin3','admin','admin3@https://www.doczj.com/doc/ac10928244.html,')"); } };

Android创建和使用数据库详细指南

Android创建和使用数据库详细指南(1) 摘要:每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库--SQLite,本文介绍的就是如何为你的Android应用程序创建和操作SQLite数据库。 数据库支持每个应用程序无论大小的生命线,除非你的应用程序只处理简单的数据,那么就需要一个数据库系统存储你的结构化数据,Android使用SQLite数据库,它是一个开源的、支持多操作系统的SQL数据库,在许多领域广泛使用,如Mozilla FireFox就是使用SQLite 来存储配置数据的,iPhone也是使用SQLite来存储数据的。 在Android中,你为某个应用程序创建的数据库,只有它可以访问,其它应用程序是不能访问的,数据库位于Android设备/data/data//databases文件夹中,在这篇文章中,你将会学习到如何在Android中创建和使用数据库。 1SQLite数据库 使用Eclipse创建一个Android项目,取名为Database,如图1所示: 图1 数据库-使用Eclipse创建你的Android新项目

2创建DBAdapter辅助类 接下来创建一个数据库,取名为bookstitles,字段如图2所示。 图2 数据库字段在DBAdapter.java文件中,定义清单1中的常量。 清单1 定义DBAdapter.java文件中的常量 package net.learn2develop.Database; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper;

android本地文件读取和保存字符串

android将数据存储到文件和从文件中读取字符串 1.读取数据(filename是读取文件的名称,reads是返回读取的字符串) private String readFile(String filename) { try { FileInputStream fis = this.openFileInput(filename); byte[] b = new byte[1024]; ByteArrayOutputStream baos = new ByteArrayOutputStream(); while (fis.read(b) != -1) { baos.write(b, 0, b.length); } baos.close(); fis.close(); reads = baos.toString(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return reads; } 2.写入保存(str是要存入的字符串,filename是保存文件的名称) private void saveFile(String str, String filename) { FileOutputStream fos; try { fos = this.openFileOutput(filename, Activity.MODE_PRIVATE); fos.write(str.getBytes()); fos.flush(); fos.close(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace();

Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解

Android学习笔记---SQLite介绍,以及使用Sqlite,进行数据库的创建,完成数据添删改查的理解 17_创建数据库与完成数据添删改查--------------------------------------1.SQLite介绍:最大特点是,无数据类型; 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据。在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER n n 、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型 n n 只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不 n n 过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数n n 据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的 n n 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。n n n 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段 n n 保存除整数以外的数据时,将会产生错误。 另外, SQLite 在解析CREATE TABLE 语句时, n n 会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段 n n 的类型信息: CREATE TABLE person (personid integer primary key autoincrement, name varchar n n (20)) SQLite可以解析大部分标准SQL语句,如:查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order byn n n 排序子句如:select * from person n n n n select * from person order by id desc n n n n select name from person group by name having count(*)>1 ---------------------------------------------------------------------------2.a.分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录n n select * from Account limit 5 offset 3 或者 select * from Account limit 3,5 n b.select * from Account limit 3,5,指的是跳过前面的3条记录,然后获取5条记录n c.select * from Account limit 3,5是select * from Account limit 5 offset 3语句 n n 的简写版 -------------------------------------------------------------------------------n 3.常用操作: a.插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person nn n n (name, age) values(‘传智’,3) b.更新语句:update 表名 set 字段名=值where 条件子句。如:update person set name=n n n n'credream ‘where id=10 c.删除语句:delete from 表名 where 条件子句。如:delete from person nwhere id=10 -------------------------------------------------------------------------------2.虽然无数据类型,但是建议加上,这样可以增加可读性,支持标准sql,oracle中的不行 ---------------------------------------------------3.获取添加记录后的自增长的ID值:select last_insert_rowid(); -----------------------------------------------------------4.在android中开发数据库应用: n a.创建数据库:以前在javaee时候,需要手工数据,但是android应用,需要运行在用户的 n n 手机上,所以,android应用,要有自动创建数据库功能,当第一次使用软件的时候 n n 就创建数据库----------------------------------------5.关于数据库自动创建的详细介绍: 我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在很 n n 多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出 n n 应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据 n n 表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手机 n n 上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工方 n n 式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为我 n n 们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库版 n n 本进行管理来实现前面提出的需求。n -----------------------------------------6.SQLite数据库添加,删除,改查操作 n A.创建数据库:SQLiteOpenHelper .getWritableDatabase ()或getReadableDatabase() n n 可以创建数据库7.创建完成以后可以使用SQLITE Expert软件打开生成的数据库n 可以看到除了生成的自己的需要的表之外,还生成了一张:android_metadata表: n 如果在sqlite中使用数据库一定会有一张android_metadata表,用来登记用户的 n 使用语言:zh_cn -----------------------------------------------------n b.数据库自动创建的过程及方法详细介绍: n n我们在编写数据库应用软件时,需要考虑这样的问题:因为我们开发的软件可能会安装在 n n 很多用户的手机上,如果应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建 n n 出应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数n n 据表结构进行更新。那么,我们如何才能实现在用户初次使用或升级软件时自动在用户的手 n n 机上创建出应用需要的数据库表呢?总不能让我们在每个需要安装此软件的手机上通过手工 n n 方式创建数据库表吧?因为这种需求是每个数据库应用都要面临的,所以在Android系统,为n n 我们提供了一个名为SQLiteOpenHelper的抽象类,必须继承它才能使用,它是通过对数据库n n 版本进行管理来实现前面提出的需求。n -------------------------------------------8.详细介绍: 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是 n n onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, intn n n newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结n n 构。当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获n n 取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生 n n 成一个数据库,接着调用onCreate()方法,onCreate()方法在初次生成数据库时才会被调用 n n ,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。 n n onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号, n n 而数据库的版本是由程序员控制的,假设数据库现在的版本是1,由于业务的变更,修改了数n n 据库表结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为n n 了实现这一目的,可以把原来的数据库版本设置为2(有同学问设置为3行不行?当然可以,如 n n 果你愿意,设置为100也行),并且在onUpgrade()方法里面实现表结构的更新。当软件的版本 n n 升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后 n n 作出相应的表结构及数据更新。 getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的 n n SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库n n 的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就 n n 会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了 n n ,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。 ------------------------------------------------------------------------9.创建数据库的代码: n a.创建项目:DBSQLIte n b./DBSQLIte/src/com/credream/service/DBOpenHelter.java n n package com.credream.service; n n import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.database.sqlite.SQLiteDatabase.CursorFactory; n n public class DBOpenHelter extends SQLiteOpenHelper { //父类没有默认构造器,需要显示调用 public DBOpenHelter(Context context) { super (context, "credream.db", null, 1); //数据库创建完成后,默认会保存在<包>/database/文件夹下 //当修改版本号时候,会触发:onUpgrade方法 //第二个:指定数据库名称, //第三个:游标工厂,用来迭代,查询后的结果集,null代表使用系统默认的 n n 游标工厂//版本号,大于0 n } /** n* 这个方法是在数据库第一次被创建的时候调用的 n*/ @Override public void onCreate(SQLiteDatabase db) { //SQLiteDatabase这个类,封装了增删改查操作,也叫做数据库操作实例 db.execSQL("CREATE TABLE person (personid integer primary keyn n n autoincrement, name varchar(20))"); //这里也可以不写name的数据类型,因为sqlite是数据类型无关的,就是写n n 了varchar(20),也可以写入超过20的内容 n n } /** n* 当数据库的版本号变更的时候被调用 n*/ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table person add phone varchar(12) null"); n n } n n } --------------------------------------------------------2.在清单文件中写入测试环境 n n n n n n n n n n ---------------------------------------------------- 3./DBSQLIte/src/com/credream/test/PersonServiceTest.java package com.credream.test; n n import com.credream.service.DBOpenHelter; n n import android.test.AndroidTestCase; n n public class PersonServiceTest extends AndroidTestCase { //创建数据库,在<包>/database/ public void testCreateDB(){ DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext()); dbOpenHelter.getWritableDatabase(); n } n n } -------------------------------------------------------4.选择方法开始测试,然后,在data/data/<包>/database/下 n 查看并用sqlite打开生成的数据库检查是否正确---------------------------------------------然后将版本号,改成2,然后再次执行,看到,表已经被更新,增加了一列phone -----------------------------------------------5.了解sqlite工作的原理: n DBOpenHelter dbOpenHelter=new DBOpenHelter(getContext()); dbOpenHelter.getWritableDatabase(); n 打开getWritableDatabase();代码:

计科1141班胡志泉安卓实验6 - 数据存储与访问

GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称实验6:数据存储与访问课程名称移动编程课程号16242215x0学院(系) 数学与计算机专业计算机科学与技术班级计科1141班学生姓名学号实验地点科技楼425 实验日期2017.4.1 一、实验目的 1.熟悉在Android Studio开发环境下编写Android应用程序的流程; 2.理解在Android Studio开发环境下进行用户界面设计的基本方法; 3.掌握应用Android碎片控件Fragment开发适用于大屏幕的应用程序的方法。 4.掌握应用Android存储方法SharePreferences的应用方法。 二、实验内容 在Android Studio开发环境下,使用Android的Fragment碎片控件、TextView文本标签控件、ListView列表控件、FrameLayout框架布局控件,利用SharePreferences存储方法,采用双页显示模式实现一个适用于大屏幕设备的简易新闻阅读器应用程序。 三、实验设备 Android Studio 四、实验结果 用户界面布局设计采用了水平线性布局方式,分为左右两个碎片Fragment;其中,左侧为新闻标题列表子界面,右侧为新闻详细内容子界面。当点击新闻标题列表中的某一标题时,右侧的Fragment将显示相应新闻标题的详细内容。

五、源代码 主Activity的布局文件activity_main.xml的源代码

Android移动应用开发实验指导书

《Android移动应用开发》 实验指导书 课程代码: 总课时数: 适用专业: 院(系)名称:

实验一深入理解Activity 目标 (1)掌握Activity的开发、配置和使用。 (2)掌握Intent的几种常用的属性。 (3)Android系统内置Intent的使用。 (4)了解Activity的生命周期 实验软、硬件环境 硬件:PC电脑一台; 配置:winxp或win7系统,内存大于4G,硬盘250G及以上 JDK1.7 、Eclipse、ADT、Android SDK 实验主要技术基础 (1)活动是Android的四大组件之一,它是一种可以包含用户界面的组件,主要用于和用户进行交互。 (2)Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。 任务 1、请在AndroidManifest.xml文件中配置SecondActivity: 配置Intent的Action属性为com.sise.intent.action.JHY_ACTION; 配置Category属性为com.sise.intent.category.JHY_CATEGORY。 通过隐式Intent的使用从FirstActivity启动SecondActivity,编写代码,运行程序,预期效果如下所示。

图1 程序运行初始化界面图2 点击图1中的按钮后的运行结果 2、请使用显式Intent启动SecondActivity,并使用Intent从FirstActiv传递数据到SecondActivity。编写代码,运行程序,预期效果如下所示。 图1 程序运行初始化界面图2 点击图1中的按钮后的运行结果 3、使用Intent传递数据从SecondActivity返回数据到FirstActivity中去。编写代码,运行程序,预期效果如下所示。 图1 程序运行初始化界面图2 点击图1按钮运行结果 图3 点击图2按钮运行结果 实验方法与步骤 (1)创建活动 Activity是Android系统提供的一个活动基类所有的活动都必须直接或间接继承此类才能拥有活动的特性。 (2)布局文件 创建布局文件 加载布局文件 (3)在清单文件中注册活动 (4)以上方法完成多个活动的创建 (5)使用Intent完成多个活动之间的交互和数据传递

Android实验报告—数据库接口

数据库接口实验 实验目的: 本实验的目的是使学生深入了解Android数据存储和访问的方法,利用SQLite进行数据存储及访问。通过实验,掌握DatePicker和TimePicker的使用方法。 实验要求: 设计程序实现一个日期信息记录数据库软件,如下图所示 设计界面,如图所示,利用SQLite实现数据库的建立、数据表中的信息的删改、查等操作。使用DatePicker和TimePicker来动态选择日期和时间,将设置的日期和时间信息写入到数据库中。 程序源码(可付纸)(包括XML和Java文件): mcy.java package cn.mcy; import java.util.Calendar; import android.app.Activity; import android.content.ContentValues; import android.database.Cursor; import android.database.SQLException; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.view.View;

import android.view.View.OnClickListener; import android.widget.Button; import android.widget.DatePicker; import android.widget.EditText; import android.widget.TextView; import android.widget.TimePicker; import android.widget.Toast; public class mcy extends Activity { /** Called when the activity is first created. */ private EditText edtEntry,edtIDEntry; private Button btnAdd,btnShowAll,btnClearShow,btnDeleteAll,btnIDDelete,btnIDSeach,btnIDRefr esh; private TextView tvSShow; private int mYear,mMonth,mDay,mHour,mMinute; private TimePicker tp; private DatePicker dp; private static final String DB_FILE="students.db",DB_TABLE="students"; private SQLiteDatabase mStuDbRW; @Override protected void onDestroy() { // TODO Auto-generated method stub super.onDestroy(); mStuDbRW.close(); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/ac10928244.html,yout.main); mcy11 friDbHp=new mcy11(getApplicationContext(),DB_FILE,null,1); friDbHp.sCreateTableCommand="CREATE TABLE "+DB_TABLE+"("+"_id INTEGER PRIMARY KEY,"+"id TEXT NOT NULL,"+"date TEXT,"+"time TEXT);"; mStuDbRW=friDbHp.getWritableDatabase(); //生成一个数据库mStuDbRW tvSShow=(TextView) findViewById(https://www.doczj.com/doc/ac10928244.html,SShow); edtEntry=(EditText) findViewById(R.id.edtEntry); edtIDEntry=(EditText) findViewById(R.id.edtIDEntry); btnAdd=(Button) findViewById(R.id.btnAdd); btnShowAll=(Button) findViewById(R.id.btnShowAll); btnClearShow=(Button) findViewById(R.id.btnClearShow); btnDeleteAll=(Button) findViewById(R.id.btnDeleteAll); btnIDDelete=(Button) findViewById(R.id.btnIDDelete); btnIDSeach=(Button) findViewById(R.id.btnIDSeach); btnIDRefresh=(Button) findViewById(R.id.btnIDRefresh); tp=(TimePicker) findViewById(R.id.TimePicker01);

Android-Room数据库的使用方法教程

Android-Room数据库的使用方法教程 Room是一个持久性数据库,提供了SQLite的抽象层,以便在充分利用SQLite的同时允许流畅的数据库访问。这篇文章主要介绍了详细介绍Android-Room数据库的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧。 为什么会选择Room? 前面我也说到了现在也有不少开源的数据库给大家使用,那为什么我们还要去学习使用这个库呢?当然不是我前面说的“正不正统”的原因了。 因为Room有下面几个优点: ①SQL查询在编译时就会验证- 在编译时检查每个@Query和@Entity等,这就意味着没有任何运行时错误的风险可能会导致应用程序崩溃(并且它不仅检查语法问题,还会检查是否有该表)

②较少的模板代码 ③与LiveData 集成 该如何使用它? 1、在app/build.gradle中添加以下依赖 implementation 'android.arch.persistence.room:runtime:1.0.0' annotationProcessor 'android.arch.persistence.room:compiler:1.0.0' 你可以点击这里查看最新依赖版本号 2、创建JavaBean @Entity public class User {

@PrimaryKey(autoGenerate = true)//主键是否自动增长,默认为false private int id; private String name; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; }

Android客户端与服务器数据交互流程

Android客户端与服务器数据交互流程 一个门户网站的制作的流程:首先,由网页设计师只做网页设计,即画出来网站在浏览器中显示的样子,然后由前端人员编写 Html+CSS+JS来实现网站的动态效果,比如说导航栏的下拉显示,然后Ajax的局部信息更新等,然后通过后台程序如JSP,PHP, .NET等语言将数据库中的信息与前台页面相结合,这样,一个站就这样被建好了。而Android客户端,也是有UI设计师,UI前端,程序构成的,同样程序这边的话,最近Html5+CSS3的火热开启,很多公司也需要html5+css3进行Android程序的开发了。呜呜,抢我的饭碗。虽然说哥也是懂html+css的。嘿嘿,这样解释的话,可能大家不清楚,其实木有必要弄清楚网站的建站过程,这里只是给大家普及一下知识,没必要弄清楚。 基础知识:我们需要知道,Http协议是基于TCP协议的,而TCP协议是一种有连接,可靠的传输协议,如果丢失的话,会重传。所以这样的话,就不会有数据的丢失了。而Http协议有三种方法,Get,Post,Head 方法,但是用的多的只有Get和Post方法,Get方法是将请求参数放在请求头中,所以请求的参数在URL中可见,而Post方法是将请求参数放在数据部分,所以在URL中不可见,Post相对来说保密,所以在提交重要信息的时候,用的都是HttpPost方法来实现的. 而在B/S模式中,B代表浏览器,S代表服务器,在浏览器和服务器的通信之中,因为B/S之间不会一直保持连接,所以才会加入Cookie 机制,来辨认所操作的对象。用户浏览网页的操作如下:当用户点击

一个连接或者一个按钮的时候,浏览器通过发送一个请求给服务器,然后由服务器接收该请求,然后解析到用户请求的是哪些内容,然后查找到相关资源,再将数据返回给浏览器,由浏览器解析数据,然后显示给用户看到用户所需要看到的页面。所以,Android和B/S模式差不多,其实也就是发送请求,接收数据,然后解析数据,显示到手机上的过程,没什么太大的区别,谁让咱用的是互联网,用的是TCP/IP 协议呢,是吧。要理解是:所有的操作都是向服务器请求数据的过程。 hp文件,然后浏览器会将php文件解析成为html然后显示在浏览器上显示。

Android 中数据库查询方法 query

Android 中数据库查询方法query() 中的select Android 中涉及数据库查询的地方一般都会有一个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 name null, // columns "id=" + id + " AND name='" + name + "'", // selection //...... 更多参数省略 ); } public doQuery(long id, final String name) { mDb.query("some_table", // table name null, // columns "id=" + id + " AND name='" + name + "'", // selection //...... 更多参数省略 ); }

Android数据存储和数据访问

南昌航空大学实验报告 二0一4 年11 月14 日 课程名称:Android 实验名称:Android数据存储和数据访问 班级:姓名:同组人: 指导教师评定:签名: 一:实验目的 掌握SharedPreferences的使用方法; 掌握各种文件存储的区别与适用情况; 了解SQLite数据库的特点和体系结构; 掌握SQLite数据库的建立和操作方法; 理解ContentProvider的用途和原理; 掌握ContentProvider的创建与使用方法 二:实验工具 Eclipse(MyEclipse)+ ADT + Android2.2 SDK; 三:实验题目 1.应用程序一般允许用户自己定义配置信息,如界面背景颜色、字体大小和字体颜色等,尝试使用SharedPreferences保存用户的自定义配置信息,并在程序启动时自动加载这些自定义的配置信息。 2.尝试把第1题的用户自己定义配置信息,以INI文件的形式保存在内部存储器上。 3.使用代码建库的方式,创建名为test.db的数据库,并建立staff数据表,表内的属性值如下表所示:

4.建立一个ContentProvider,用来共享第3题所建立的数据库; 四:实验代码 Internal public class Internal extends Activity { private final String = ""; private TextView labelView; private TextView displayView; private CheckBox appendBox ; private EditText entryText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(https://www.doczj.com/doc/ac10928244.html,yout.main); labelView = (TextView)findViewById(https://www.doczj.com/doc/ac10928244.html,bel); displayView = (TextView)findViewById(R.id.display); appendBox = (CheckBox)findViewById(R.id.append); entryText = (EditText)findViewById(R.id.entry); Button writeButton = (Button)findViewById(R.id.write); Button readButton = (Button)findViewById(R.id.read); writeButton.setOnClickListener(writeButtonListener); readButton.setOnClickListener(readButtonListener); entryText.selectAll(); entryText.findFocus(); } OnClickListener writeButtonListener = new OnClickListener() { @Override public void onClick(View v) {

相关主题
文本预览
相关文档 最新文档