比较好的 android 教程 android实战教程

admin2024-05-30  16

今天早上去图书馆找Android书看,最近做数据库方面的小项目,觉得这本书上的数据库知识不错,因为自己是新手,每学到新的知识,就觉得很开心。

废话少说,这本书是《Android基础教程》。作者:[美]Ed Burnette。抄录151-

1.数据库

为了演示SQLite,创建一个名为Events的小应用程序

接下来是Constants接口

<pre name="code" class="java">import android.provider.BaseColumns;

public interface Constants extends BaseColumns {
	public static final String TABLE_NAME = "events";

	// Columns in the Events database
	public static final String TIME = "time";
	public static final String TITLE = "title";
}




注:为什么Constants是一个接口

为了不用每次输入这个变量时,都重复的输入类名。例如,我只希望输入TIME,而不是每次Constants.TIME.通常,在Java中实现这一目的的方式就是通过接口。类可以继承自Constants接口,然后在引用字段时省去接口名,BaseColumns接口,使用的是同样的技巧。

但是自从Java5后开始有一个更好的方法:静态导入。

由于之前Eclipse对静态导入的支持还不完善,所以如果你在程序中使用静态导入,Eclipse可能不会自动插入导入语句,这是有个小技巧:在包语句后面输入这样一个通配符静态导入(例如,import static com.example.demo1.Constants.*),使所有的语句能够顺利编译,然后可以使用Source>Organize Imports来展开通配符并对导入语句排序。

1.1使用SQLiteOpenHelper

接下来创建一个名为EventsData的帮助器类来表示数据库本身

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import static com.example.demo1.Constants.*;

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

	public EventsData(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL("create table " + TABLE_NAME + "(" + _ID
				+ " integer primary key autoincrement," + TIME + " integer,"
				+ TITLE + " text not null);");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("drop table if exists" + TABLE_NAME);
		onCreate(db);
	}
}

1.2定义主程序

布局文件:layout/main.xml

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <TextView
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</ScrollView>

主程序是Events活动中的oncreate()方法。以下是基本内容:

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import static com.example.demo1.Constants.*;

public class Events extends Activity {
	private EventsData events;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		events = new EventsData(this);
		try {
			addEvent("Hello Android!");
			Cursor cursor = getEvents();
			showEvents(cursor);
		} finally {
			events.close();
		}
	}

}

在onCreate()中,创建了EventsData实例并启动了一个try块。在finally块中关闭了数据库。这样即使中间发生了什么错误,数据库仍然会关闭。

addEvents()方法来向表中添加一个事件,每次运行此程序,都会获得一个新的事件,可以根据添加菜单,手势或击键来生成其他事件,getEvents()来获取事件列表,showEvents()来显示用户列表。

1.3添加一行

private void addEvent(String string) {
		// Insert a new record into the Events data source
		// You would do something similar for delete and update
		SQLiteDatabase db = events.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put(TIME, System.currentTimeMillis());
		values.put(TITLE, string);
		db.insertOrThrow(TABLE_NAME, null, values);
	}

因为需要修改数据库,所以需要调用getWritableDatabase()来获取events数据库的读/写句柄。

1.4运行一个查询

getEvents()方法执行数据库查询:

<span >	</span>private static String[] FROM = { _ID, TIME, TITLE };
	private static String ORDER_BY = TIME + " desc";
	private Cursor getEvents() {
		SQLiteDatabase db = events.getReadableDatabase();
		Cursor cursor = db.query(TABLE_NAME, FROM, null, null, null, null,
				ORDER_BY);
		startManagingCursor(cursor);
		return cursor;
	}

无需修改数据库,所以调用getReadableDatabase()来获得一个只读句柄。

1.5显示查询结果

需要定义的最后一个方法是showEvents(),此函数接受一个Cursor作为输入并格式化输出,以便用户能够理解输出的内容。

private void showEvents(Cursor cursor) {
		StringBuilder builder = new StringBuilder("Saved events:\n");
		while (cursor.moveToNext()) {
			// Could use getColumnIndexOrThrow() to get indexs
			long id = cursor.getLong(0);
			long time = cursor.getLong(1);
			String title = cursor.getString(2);
			builder.append(id).append(":");
			builder.append(time).append(":");
			builder.append(title).append("\n");
		}
		// Display on the screen
		TextView text = (TextView) findViewById(R.id.text);
		text.setText(builder);
	}


接下来书上找到的:升级数据库的最佳方法


每一个数据库版本都会对应一个版本号,当指定的版本号大于当前数据库的版本号时,就会进入onUpgrade()方法中进行操作。

这里需要为每一个版本号赋予它各自改变的内容,然后在onUpgrade()方法中中对当前数据库的版本号进行判断。


/**
 * 第一版,只需要创建一个Book表
 */
public class MyDatabaseHelper1 extends SQLiteOpenHelper {
	private static final String CREATE_BOOK = "create table Book("
			+ "'id integer primary key autoincrement'," + "'tuthor text',"
			+ "'price real'," + "'pages integer'," + "'name text')";

	public MyDatabaseHelper1(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_BOOK);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("drop table if exists Book");
		onCreate(db);
	}
}





/**
 * 第二版,只需要创建一个Book表。需要加入一个Category表
 */

public class MyDatabaseHelper2 extends SQLiteOpenHelper {

	private static final String CREATE_BOOK = "create table Book("
			+ "'id integer primary key autoincrement'," + "'tuthor text',"
			+ "'price real'," + "'pages integer'," + "'name text')";

     <strong> private static final String CREATE_CATEGORY = "create table Category('id integer primary key autoincrement',"
			+ "'category_name text','category_code integer')";</strong>

	public MyDatabaseHelper2(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_BOOK);
		<strong>db.execSQL(CREATE_CATEGORY);</strong>
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		<strong>switch (oldVersion) {
		case 1:
			db.execSQL(CREATE_CATEGORY);
		default:
		}</strong>
	}
}



/**
 * 第三版,只需要创建一个Book表。需要加入一个Category表。需要在Book表中加入category_id字段
 */

public class MyDatabaseHelper3 extends SQLiteOpenHelper {

	private static final String CREATE_BOOK = "create table Book("
			+ "'id integer primary key autoincrement','tuthor text',"
			+ "'price real','pages integer',"
			+ "'name text',<strong>'category_id integer'</strong>)";

	private static final String CREATE_CATEGORY = "create table Category('id integer primary key autoincrement',"
			+ "'category_name text','category_code integer')";

	public MyDatabaseHelper3(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		db.execSQL(CREATE_BOOK);
		db.execSQL(CREATE_CATEGORY);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		/*
		 * switch没有使用break,这是为了保证在跨版本升级的时候,每一次的数据库修改都能被全部执行到,(所有case都走一遍)
		 */
		switch (oldVersion) {
		case 1:
			db.execSQL(CREATE_CATEGORY);
		case 2:
			<strong>db.execSQL("alter table Book add column category_id integer");</strong>
		default:
		}
	}
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!