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

Android创建和使用数据库详细指南
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;

import android.util.Log;

public class DBAdapter

{

public static final String KEY_ROWID = "_id";

public static final String KEY_ISBN = "isbn";

public static final String KEY_TITLE = "title";

public static final String KEY_PUBLISHER = "publisher";

private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "books";

private static final String DATABASE_TABLE = "titles";

private static final int DATABASE_VERSION =1;

private static final String DATABASE_CREATE =

"create table titles (_id integer primary key autoincrement, "

+ "isbn text not null, title text not null, "

+ "publisher text not null);";

private final Context context;

}

DATABASE_CREATE常量包括创建titles表的SQL语句。

在DBAdapter类中,你可以扩展SQLiteOpenHelper类,它是一个Android辅助类,主要用于数据库创建和版本管理。实际上,你可以覆盖onCreate()和onUpgrade()方法,如清单2所示。

清单2 在DBAdapter类中,扩展SQLiteOpenHelper类覆盖onCreate() 和onUpgrade()方法

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;

import android.util.Log;

public class DBAdapter

{

public static final String KEY_ROWID = "_id";

public static final String KEY_ISBN = "isbn";

public static final String KEY_TITLE = "title";

public static final String KEY_PUBLISHER = "publisher";

private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "books";

private static final String DATABASE_TABLE = "titles";

private static final int DATABASE_VERSION =1;

private static final String DATABASE_CREATE =

"create table titles (_id integer primary key autoincrement, " + "isbn text not null, title text not null, "

+ "publisher text not null);";

private final Context context;

private DatabaseHelper DBHelper;

private SQLiteDatabase db;

public DBAdapter(Context ctx)

{

this.context = ctx;

DBHelper = new DatabaseHelper(context);

}

private static class DatabaseHelper extends SQLiteOpenHelper {

DatabaseHelper(Context context)

{

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db)

{

db.execSQL(DATABASE_CREATE);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion,

int newVersion)

{

Log.w(TAG, "Upgrading database from version " + oldVersion

+ " to "

+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS titles");

onCreate(db);

}

}

}

onCreate()方法创建一个新的数据库,onUpgrade()方法用于升级数据库,这可以通过检查DATABASE_VERSION常量定义的值来实现,对于onUpgrade()方法而言,只不过是简单地删除表,然后在创建表而已。

现在你可以定义不同的方法来打开和关闭数据库,如清单3中的添加/编辑/删除/行的函数。

清单3 定义打开和关闭数据库以及增加/编辑/删除表中行的方法

public class DBAdapter

{

//...

//...

//---打开数据库---

public DBAdapter open() throws SQLException

{

db = DBHelper.getWritableDatabase();

return this;

}

//---关闭数据库---

public void close()

{

DBHelper.close();

}

//---向数据库插入一个标题---

public long insertTitle(String isbn, String title, String publisher)

{

ContentValues initialValues = new ContentValues();

initialValues.put(KEY_ISBN, isbn);

initialValues.put(KEY_TITLE, title);

initialValues.put(KEY_PUBLISHER, publisher);

return db.insert(DATABASE_TABLE, null, initialValues);

}

//---删除一个指定的标题---

public boolean deleteTitle(long rowId)

{

return db.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) >0; }

//---检索所有标题---

public Cursor getAllTitles()

{

return db.query(DATABASE_TABLE, new String[] {

KEY_ROWID,

KEY_ISBN,

KEY_TITLE,

KEY_PUBLISHER},

null,

null,

null,

null,

null);

}

//---检索一个指定的标题---

public Cursor getTitle(long rowId) throws SQLException

{

Cursor mCursor =

db.query(true, DATABASE_TABLE, new String[] {

KEY_ROWID,

KEY_ISBN,

KEY_TITLE,

KEY_PUBLISHER

},

KEY_ROWID + "=" + rowId,

null,

null,

null,

null,

null);

if (mCursor !=null) {

mCursor.moveToFirst();

}

return mCursor;

}

//---更新一个标题---

public boolean updateTitle(long rowId, String isbn,

String title, String publisher)

{

ContentValues args = new ContentValues();

args.put(KEY_ISBN, isbn);

args.put(KEY_TITLE, title);

args.put(KEY_PUBLISHER, publisher);

return db.update(DATABASE_TABLE, args,

KEY_ROWID + "=" + rowId, null) >0;

}

}

注意Android使用Cursor类返回一个需要的值,Cursor作为一个指针从数据库查询返回结果集,使用Cursor允许Android更有效地管理它们需要的行和列,你使用ContentValues 对象存储键/值对,它的put()方法允许你插入不同数据类型的键值。

清单4显示了完整的DBAdapter.java源代码。

清单4 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;

import android.util.Log;

public class DBAdapter

{

public static final String KEY_ROWID = "_id";

public static final String KEY_ISBN = "isbn";

public static final String KEY_TITLE = "title";

public static final String KEY_PUBLISHER = "publisher";

private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "books";

private static final String DATABASE_TABLE = "titles";

private static final int DATABASE_VERSION =1;

private static final String DATABASE_CREATE =

"create table titles (_id integer primary key autoincrement, " + "isbn text not null, title text not null, "

+ "publisher text not null);";

private final Context context;

private DatabaseHelper DBHelper;

private SQLiteDatabase db;

public DBAdapter(Context ctx)

{

this.context = ctx;

DBHelper = new DatabaseHelper(context);

}

private static class DatabaseHelper extends SQLiteOpenHelper {

DatabaseHelper(Context context)

{

super(context, DATABASE_NAME, null, DATABASE_VERSION);

}

@Override

public void onCreate(SQLiteDatabase db)

{

db.execSQL(DATABASE_CREATE);

}

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion,

int newVersion)

{

Log.w(TAG, "Upgrading database from version " + oldVersion

+ " to "

+ newVersion + ", which will destroy all old data");

db.execSQL("DROP TABLE IF EXISTS titles");

onCreate(db);

}

}

//---打开数据库---

public DBAdapter open() throws SQLException

{

db = DBHelper.getWritableDatabase();

return this;

}

//---关闭数据库---

public void close()

{

DBHelper.close();

}

//---向数据库中插入一个标题---

public long insertTitle(String isbn, String title, String publisher) {

ContentValues initialValues = new ContentValues();

initialValues.put(KEY_ISBN, isbn);

initialValues.put(KEY_TITLE, title);

initialValues.put(KEY_PUBLISHER, publisher);

return db.insert(DATABASE_TABLE, null, initialValues); }

//---删除一个指定标题---

public boolean deleteTitle(long rowId)

{

return db.delete(DATABASE_TABLE, KEY_ROWID +

"=" + rowId, null) >0;

}

//---检索所有标题---

public Cursor getAllTitles()

{

return db.query(DATABASE_TABLE, new String[] {

KEY_ROWID,

KEY_ISBN,

KEY_TITLE,

KEY_PUBLISHER},

null,

null,

null,

null,

null);

}

//---检索一个指定标题---

public Cursor getTitle(long rowId) throws SQLException {

Cursor mCursor =

db.query(true, DATABASE_TABLE, new String[] {

KEY_ROWID,

KEY_ISBN,

KEY_TITLE,

KEY_PUBLISHER

},

KEY_ROWID + "=" + rowId,

null,

null,

null,

null,

null);

if (mCursor !=null) {

mCursor.moveToFirst();

}

return mCursor;

}

//---更新一个标题---

public boolean updateTitle(long rowId, String isbn, String title, String publisher)

{

ContentValues args = new ContentValues();

args.put(KEY_ISBN, isbn);

args.put(KEY_TITLE, title);

args.put(KEY_PUBLISHER, publisher);

return db.update(DATABASE_TABLE, args,

KEY_ROWID + "=" + rowId, null) >0;

}

}

3使用数据库

4增加一个标题

如果想在titles表中增加一个标题,可以使用DBAdapter类的insertTitle()方法:

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/0e4774246.html,yout.main);

DBAdapter db = new DBAdapter(this);

//---add 2 titles---

db.open();

long id;

id = db.insertTitle(

"0470285818",

"C# 2008 Programmer's Reference",

"Wrox");

id = db.insertTitle(

"047017661X",

"Professional Windows Vista Gadgets Programming",

"Wrox");

db.close();

}

insertTitle()方法返回插入行的ID,如果在添加过程中遇到错误,它就返回-1。

如果你分析Android设备/模拟器的文件系统,你可以看到book数据库创建在database 文件夹下,如图3所示。

图3 database文件夹

5检索所有标题

想要检索titles表中的所有标题,可以使用DBAdapter类的getAllTitles()方法,如清单5所示。

清单5 使用DBAdapter类的getAllTitles()方法检索titles表中的所有标题

package net.learn2develop.Database;

import android.app.Activity;

import android.database.Cursor;

import android.os.Bundle;

import android.widget.Toast;

public class DatabaseActivity extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/0e4774246.html,yout.main);

DBAdapter db = new DBAdapter(this);

//---获取所有标题---

db.open();

Cursor c = db.getAllTitles();

if (c.moveToFirst())

{

do {

DisplayTitle(c);

} while (c.moveToNext());

}

db.close();

}

}

返回的结果是一个Cursor对象,如果要显示所有标题,你首先应该调用Cursor对象的moveToFirst()方法,如果它成功(意味着至少有一行有效),使用DisplayTitle()方法显示详细

图4显示Toast类,它从数据库中检索并显示一个标题。

图4 Toast类

6检索单个标题

返回的结果是一个Cursor对象,如果返回一行,可以使用DisplayTitle()方法显示标题的详细信息,否则就使用Toast类显示一个错误消息。

7更新一个标题

要更新一个特定的标题,可以调用DBAdapter的updateTitle()方法,传递想要更新的标题的ID给它就可以了,如清单6所示。

清单6 调用DBAdapter类的updateTitle()方法更新标题

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/0e4774246.html,yout.main);

DBAdapter db = new DBAdapter(this);

//---更新标题---

db.open();

if (db.updateTitle(1,

"0470285818",

"C# 2008 Programmer's Reference",

"Wrox Press"))

Toast.makeText(this, "Update successful.",

Toast.LENGTH_LONG).show();

else

Toast.makeText(this, "Update failed.",

Toast.LENGTH_LONG).show();

//-------------------

//---检索相同的标题---

Cursor c = db.getTitle(1);

if (c.moveToFirst())

DisplayTitle(c);

else

Toast.makeText(this, "No title found",

Toast.LENGTH_LONG).show();

//-------------------

db.close();

}

如果更新成功会显示一条表示成功的消息,同时,你可以检索刚刚更新的标题看更新结果是否正确。

8删除一个标题

想要删除一个标题,可以调用DBAdapter类的deleteTitle()方法,传递你想要删除的标题的ID即可:

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(https://www.360docs.net/doc/0e4774246.html,yout.main);

DBAdapter db = new DBAdapter(this);

//---delete a title---

db.open();

if (db.deleteTitle(1))

Toast.makeText(this, "Delete successful.",

Toast.LENGTH_LONG).show();

else

Toast.makeText(this, "Delete failed.",

Toast.LENGTH_LONG).show();

db.close();

}

如果删除成功会显示一条表示成功的消息。

9升级数据库

要升级数据库,修改DBAdapter类中DATABASE_VERSION常量的值比之前的值大,如之前的值是1,将其改为2:

public class DBAdapter

{

public static final String KEY_ROWID = "_id";

public static final String KEY_ISBN = "isbn";

public static final String KEY_TITLE = "title";

public static final String KEY_PUBLISHER = "publisher";

private static final String TAG = "DBAdapter";

private static final String DATABASE_NAME = "books";

private static final String DATABASE_TABLE = "titles";

//---change this to a higher value---

private static final int DATABASE_VERSION =2;

private static final String DATABASE_CREATE =

"create table titles (_id integer primary key autoincrement, "

+ "isbn text not null, title text not null, "

+ "publisher text not null);";

当你再次运行这个应用程序时,你会在Eclipse的LogCat窗口中看到数据库已经升级的消息,如图5所示。

图5 LogCat窗口-消息显示数据库升级成功

10简化数据库访问

使用DBAdapter类,可以简化你的Android应用程序访问数据库记录的操作,一个重要的事情是在Android中创建的SQLite数据库只有创建它的应用程序可以访问它。如果你要共享数据,你需要使用一个内容提供器,这个将在以后的文章中再介绍了。

安卓手机数据库连接代码

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.360docs.net/doc/0e4774246.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.360docs.net/doc/0e4774246.html,')"); db.execSQL("insert into users values(2,'admin1','admin','admin1@https://www.360docs.net/doc/0e4774246.html,')"); db.execSQL("insert into users values(3,'admin2','admin','admin2@https://www.360docs.net/doc/0e4774246.html,')"); db.execSQL("insert into users values(4,'admin3','admin','admin3@https://www.360docs.net/doc/0e4774246.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 APP开发入门教程

工作中有做过手机App项目,前端和android或ios程序员配合完成整个项目的开发,开发过程中与ios程序配合基本没什么问题,而android各种机子和rom的问题很多,这也让我产生了学习android和ios程序开发的兴趣。于是凌晨一点睡不着写了第一个android程序HelloAndroid,po出来分享给其他也想学习android开发的朋友,这么傻瓜的Android开发入门文章,有一点开发基础的应该都能看懂。 一、准备工作 主要以我自己的开发环境为例,下载安装JDK和Android SDK,假如你没有现成的IDE,你可以直接下载SDK完整包,里面包含了Eclipse,如果有IDE那么你可以滚动到下面选择U SE AN EXISTING IDE,然后安装SDK,如果你的SDK在安装时找不到JDK目录,你可以在系统环境变量里添加JAVA_HOME变量,路径为你的JDK目录,我的IDE是IntelliJ IDEA,都装好以后开始配置IDE增加SDK支持。 首先,打开Android SDK Manager把Android 4.0以上版本的未安装的都打勾装上,根据你个人实际情况,如果你只打算用自己的手机测试,那就把你机子系统一样版本的SDK包装上,下载时间有点长。

然后打开IDE创建新项目,IDEA比较智能,如果你装好了SDK,新建项目里就会出现Andro id的Application Module,选择后右边Project SDK为空,点击New按钮,找到SDK目录确定,下拉列表就会列出已经安装的各个版本的SDK,选择自己需要的版本,如果是第一次设置,IDE会提醒你先设置JDK,根据提示找到JDK目录即可。

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();代码:

A20_Android开发手册_V1[1].0

C o n f i d e n t i a l A20Android 开发手册 V 1.0 2013-02013-03 3-15

C o n f i d e n t i a l Revision History Version Date Section/Page Changes 1.0 2013-03-15 初始版本

C o n f i d e n t i a l 目录 一、A20概述 (4) 1.1A20主控介绍.....................................................................................................................51.2外围设备介绍.....................................................................................................................51.3软件资源介绍.....................................................................................................................5二、建立开发环境. (5) 2.1硬件资源............................................................................................................................62.2软件资源. (6) 2.2.1安装JDK (ubuntu12.04).....................................................................................62.2.2安装平台支持软件(ubuntu12.04).....................................................................62.2.3安装编译工具链(ubuntu12.04).........................................................................62.2.4安装phoenixSuit (windows xp )........................................................................72.2.5其他软件(windows xp ).. (7) 三、源码下载 (8) 3.1wing 源码下载....................................................................................................................83.2仓库的目录树.. (8) 3.2.1android 目录树.........................................................................................................83.2.2lichee 目录结构.. (9) 3.2.2.1buildroot 目录结构........................................................................................93.2.2.2linux-3.3目录结构......................................................................................103.2.2.3u-boot 目录结构..........................................................................................113.2.2.4tools 目录结构............................................................................................123.2.2.5boot 目录结构 (12) 四、编译和打包 (13) 4.1源码编译 (13) 4.1.1lichee 源码编译......................................................................................................134.1.2android 源码编译...................................................................................................134.2打包固件.. (13) 4.2.1完全打包...............................................................................................................134.2.2局部打包 (14) 五、固件烧写 (14) 5.1使用PhoenixSuit 烧写固件.............................................................................................145.2使用fastboot 更新系统 (14) 5.2.1进入fastboot 模式.................................................................................................145.2.2fastboot 命令使用.. (15) 六、recovery 功能使用 (15) 6.1键值的查看......................................................................................................................156.2按键选择..........................................................................................................................166.3功能使用..........................................................................................................................16七、调试 (17) 7.1调试apk...........................................................................................................................177.2调试linux 内核. (17)

Android开发指南-二维图形

Android开发指南-二维图形收藏 二维图形2D Graphics Android 提供一个定制的2D图形库,用来绘制图形图像和制作动画。你将从 android.graphics.drawable和android.view.animation包中找到这些通用类。 本文简单介绍如何在Android应用程序中进行画图。我们将讨论使用Drawable对象画图的基础知识,如何使用几个Drawable子类,以及如何创建动画,一个图形的补间动画或者一系列图形的连续动画(就像电影胶卷一样)。 可绘制物Drawables 一个Drawable 是一个“某些可以被绘制的物体”的一般抽象。你将发现这个Drawable类扩展了多种具体可绘制图形类,包括 BitmapDrawable, ShapeDrawable, PictureDrawable, LayerDrawable, 等等。当然,你还可以扩展这些类来定义你自己的具有独特行为的可绘制对象。 有三种方式来定义和实例化一个Drawable:使用一个保存在你的项目资源中的图像;使用一个定义了Drawable属性的XML文件;或者使用通常的类构造函数。下面,我们将挨个讨论前面两种方法(对于一个经验丰富的开发人员而言,使用构造函数没什么新意)。 从资源图像中创建Creating from resource images 一个为你的应用程序增加图形的简单方法是通过引用项目资源中的一个图片文件。支持的图片文件格式有PNG(推荐的),JPG(可接受的)和GIF(不鼓励的)。这个技术将显然推荐使用在应用程序图标,logo,或者其它类似使用于游戏中的图形。 为了使用一个图片资源,只要把你的文件添加到你项目的res/drawable/目录即可。从那里,你可以在代码或XML布局中进行引用。任何一种方式,都是通过资源ID来引用,资源ID是不带扩展后缀的文件名(比如,my_image.png通过my_image来引用)。 注意:图像资源被放在res/drawable/里。也许会通过aapt工具进行无损图像压缩而被 自动优化。比如,一个不需要多于256色的真彩色PNG图片可能会被转换成一个带有调 色板的8位PNG。这产生了相同质量但占用更少内存的图片。因此需要意识到该目录下 的二进制图像可能会在编译期间被改变。如果你想以比特流读取一个图片并转换为一个 位图,那么需要把你的图片文件放在res/raw/目录,这里的文件不会被优化。 示例代码Example code 下面的代码片断说明了如何构造一个ImageView,从drawable资源中使用并添加到布局中。LinearLayout mLinearLayout; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a LinearLayout in which to add the ImageView mLinearLayout = new LinearLayout(this);

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开发参考文档 一、Android编码规范 1. java代码中不出现中文,最多注释中可以出现中文.xml代码中注释 2. 成员变量,局部变量、静态成员变量命名、常量(宏)命名 1). 成员变量: activity中的成员变量以m开头,后面的单词首字母大写(如Button mBackButton; String mName);实体类和自定义View的成员变量可以不以m开头(如ImageView imageView,String name), 2). 局部变量命名:只能包含字母,组合变量单词首字母出第一个外,都为大写,其他字母都为小写 3). 常量(宏)命名: 只能包含字母和_,字母全部大写,单词之间用_隔开UMENG_APP_KEY 3. Application命名 项目名称+App,如SlimApp,里面可以存放全局变量,但是杜绝存放过大的实体对象4. activity和其中的view变量命名 activity命名模式为:逻辑名称+Activity view命名模式为:逻辑名称+View 建议:如果layout文件很复杂,建议将layout分成多个模块,每个模块定义一个moduleViewHolder,其成员变量包含所属view 5. layout及其id命名规则 layout命名模式:activity_逻辑名称,或者把对应的activity的名字用“_”把单词分开。

命名模式为:view缩写_模块名称_view的逻辑名称, 用单词首字母进行缩写 view的缩写详情如下 LayoutView:lv RelativeView:rv TextView:tv ImageView:iv ImageButton:ib Button:btn 6. strings.xml中的 1). id命名模式: activity名称_功能模块名称_逻辑名称/activity名称_逻辑名称/common_逻辑名称,strings.xml中,使用activity名称注释,将文件内容区分开来 2). strings.xml中使用%1$s实现字符串的通配,合起来写 7. drawable中的图片命名 命名模式:activity名称_逻辑名称/common_逻辑名称/ic_逻辑名称 (逻辑名称: 这是一个什么样的图片,展示功能是什么) 8. styles.xml 将layout中不断重现的style提炼出通用的style通用组件,放到styles.xml中; 9. 使用layer-list和selector,主要是View onCclick onTouch等事件界面反映

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.360docs.net/doc/0e4774246.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.360docs.net/doc/0e4774246.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);

相关文档
最新文档