软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 电脑教程 > 编程开发 > 手机开发 > Eclipse开发Android应用程序入门:重装上阵

Eclipse开发Android应用程序入门:重装上阵

翻译:赵锟
原文:http://www.smashingmagazine.com/2011/03/28/get-started-developing-for-android-with-eclipse-reloaded/

在我们教程系列的第一部分中,我们使用Android和Eclipse开发了一个简单的饮茶计时器的应用程序。在第二部分,我们将继续开发这个程序,并给它增加一些其他的额外的功能。在开发的过程中,我们将给你介绍更多重要而强大的Android SDK特性,包括持久化数据存储,Activity和Intent,和共享用户首选项(译者注:类似于windows 的注册表的一种机制)。

跟着本教程,你需要上一篇教程中的代码,如果你想直接使用代码,你可以使用如下的指令从GitHub上check out出tutorial_par_1标记的代码:

$ git clone git://github.com/cblunt/BrewClock.git
$ cd BrewClock
$ git checkout tutorial_part_1

在GitHub中检出了代码后,你需要将代码倒入到Eclipse中的项目中:

  1. 运行 Eclipse 选择 File → Import…
  2. 在导入窗口, 选择 “Existing Projects into Workspace”并点击 “Next.”
  3. 在下一屏,点击 “Browse,”选择你从GitHub上clone出的代码目录。
  4. 点击“Finish” 将项目导入到Eclipse中。


在导入项目到Eclipse之后,你有可能会看到有如下的警告信息:

Android required .class compatibility set to 5.0.
Please fix project properties.

如果有这种情况,右键点击“Project Explorer ”中新导入的BrewClock项目,并选择 “Fix Project Properties,” 并重启Eclipse。

数据持久化入门

当前,BrewClock 让用户为他们泡的茶设置一个定时器。这个非常棒的一个工作,但是如果对于不同的茶使用同一个泡茶时间的结果会怎样呢,是不每种茶都应该有自己的一个泡茶时间呢?如果这样,那岂不是所有的用户都需要记下每一类茶所需要泡的时间!这不是一个很好的用户体验。因此,在这篇教程中,我将新增一个功能来为用户每种不同的茶叶存放一个泡茶时间,并当用户想泡茶的时候,可以从茶叶列表中进行选择。

为了实现这个目的,我们得利用Android的丰富的数据持久化的API。Android提供了几种方式来存储数据,本文将要覆盖其中的两种方式。第一种,使用SQLite数据库引擎来为我们存储数据。

SQLite 是一种流行的轻量级SQL数据库引擎,它将数据存在单个文件中。SQLite经常用于桌面或在那些运行不能运行客户端-服务器SQL引擎(例如MySQL或PostgreSQL)的嵌入式的应用上。

每个安装在Android上的应用都可以保存和使用多个SQLite数据库文件(由数据存储容量决定),这些数据由系统自动地进行管理。应用程序的数据是私有并且不能被其他的应用程序所访问。(数据可以通过ContentProvider(译者注:内容提供者类)类进行共享,但是我们不会在本教程中覆盖关于内容提供者的内容)。当数据应用程序被更新时,数据库文件就进行持久化,当应用程序被删除时,数据库文家就被删除。

我们在BrewClock应用使用SQLite数据来维护我们的茶叶列表和泡茶所需要的时间。下面是我们我们将使用的数据表的一个总体介绍。

+-------------------------------------+
| Table: teas                         |
+------------+------------------------+
| Column     | Description            |
+------------+------------------------+
| _ID        | integer, autoincrement |
| name       | text, not null         |
| brew_time  | integer, not null      |
+------------+------------------------+

如果以前你使用过SQL,你应该熟悉这些内容。数据表有三个字段,一个唯一标示(_ID),茶叶名称(name)和泡茶时间(brew_time)字段。我们将使用Android提供给我们的API在应用中建立数据表。系统将负责在正确的位置为我们的创建数据库文件。

抽象数据库

为了确保数据库的代码容易被维护,我们用一个单独的类TeaData来抽象所有处理数据库创建,插入,和查询的代码。如果你熟悉模型-试图-控制(译者注:MVC)方法的话,这个你也应该熟悉。所有数据库代码与我们的BrewClockActitvity类隔离开来。Actitvity可以初始化一个新的TeaData实例(这个实例将连接数据库)并完成它所需要的工作。以这种方式工作保证了我们可以方便的更改我们所使用的数据库而不用修改其他那些和数据库不相关部分的代码。

通过菜单File → New → Class.在BrewClock项目中创建一个TeaData的新类。确保TeaData扩展于android.database.sqlite.SQLiteOpenHelper 类,并选中“Constructors from superclass”复选框。

TeaData 类将为你自动地处理SQLite数据库的创建和版本。我们需要增加一些方法来作为其他代码到数据库的接口。

增加两个常量来存储数据库的名字和版本,增加表名和表中列名。我们使用Android提供的常类BaseColumns._ID来做为表的唯一id列:

// src/com/example/brewclock/TeaData.java
import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.DatabaseUtils;
import android.provider.BaseColumns;

public class TeaData extends SQLiteOpenHelper {
  private static final String DATABASE_NAME = "teas.db";
  private static final int DATABASE_VERSION = 1;

  public static final String TABLE_NAME = "teas";

  public static final String _ID = BaseColumns._ID;
  public static final String NAME = "name";
  public static final String BREW_TIME = "brew_time";

  // …
}

为TeaData增加一个构造方法,以数据库名称合版本号为参数调用其父类的构造方法。Android将会自动地打开数据库(如果数据库不存在就自动创建它)。

// src/com/example/brewclock/TeaData.java
public TeaData(Context context) {
  super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

我们需要重载onCreate方法,并执行一个SQL 串执行创建数据库表的操作。Android将会在数据库文件第一次被创建时调用这个方法。

在启动过程中,Android检查数据库的版本是否我们传入的版本一致。如果版本发生了改变,Android将会调用onUpgrade方法,在这个方法总,你可以编写修改数据库结构的业务逻辑。在本教程中,我们将让Android删除数据库并重建数据库。

在onCreate和onUpgrade中增加如下的代码:

// src/com/example/brewclock/TeaData.java
@Override
public void onCreate(SQLiteDatabase db) {
  // CREATE TABLE teas (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, brew_time INTEGER);
  String sql =
    "CREATE TABLE " + TABLE_NAME + " ("
      + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
      + NAME + " TEXT NOT NULL, "
      + BREW_TIME + " INTEGER"
      + ");";

  db.execSQL(sql);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
  onCreate(db);
}

下一步,我们需要新增代码让我们方便地在数据库中新增茶叶记录。我们新增一个带茶叶名称和泡茶时间的方法来负责插入记录。Android为了尽量避免开发者使用SQL语句,提供了一堆类来处理向数据库中查入记录。首先,我们创建一个ContentValues集合,并将相关的值插入到这个集合中去。

对于ContentValues集合,我们只要简单地提供一个列名和值来插入就行了。Android负责创建和运行正确的SQL。使用Android的数据类确保了你能写出安全,跨平台的数据库操作代码。

Add a new method, insert(), to the TeaData class:

// src/com/example/brewclock/TeaData.java
public void insert(String name, int brewTime) {
  SQLiteDatabase db = getWritableDatabase();

  ContentValues values = new ContentValues();
  values.put(NAME, name);
  values.put(BREW_TIME, brewTime);

  db.insertOrThrow(TABLE_NAME, null, values);
}

查询数据

我们应用程序具有了在数据库中保存数据的能力后,我们同样也需要一种方式将数据取回来。Android提供了游标Cursor接口来完成这件工作。一个游标代表了针对数据库运行一个SQL返回的结果集,游标在这个结果集中维护了一个指针来指向结果集中的一行。这个指针可以向前,向后移动,并返回每一列的值,下面我们用图形来帮助你理解游标:

SQL 查询: SELECT * from teas LIMIT 3;

+-----------------------------------+

|  _ID  |  name       |  brew_time  |

+-----------------------------------+

|    1  |  Earl Grey  |          3  |

|    2  |  Green      |          1  | <= Cursor

|    3  |  Assam      |          5  |

+-------+-------------+-------------+

在这个例子中,游标指向了结果集中的第二条记录(绿茶)。我们可以通过调用cursor.moveToPrevious()方法,将游标向前移动,让它指向第一行(Earl Grey),或者调用moveToNext向前移动指向Assam。要取到游标所指向记录的茶叶的名称,我们只要调用cursor.getString(1),1代表我们向提取数据列的下标(注意下标识从0开始的,1代表第二列,依次类推)。

在了解游标后,我们增加一个创建游标对象并返回数据库中所有的茶叶信息。在TeaData中增加all方法:

// src/com/example/brewclock/TeaData.java
public Cursor all(Activity activity) {
  String[] from = { _ID, NAME, BREW_TIME };
  String order = NAME;

  SQLiteDatabase db = getReadableDatabase();
  Cursor cursor = db.query(TABLE_NAME, from, null, null, null, null, order);
  activity.startManagingCursor(cursor);

  return cursor;
}

相关阅读
栏目导航
推荐软件