码迷,mamicode.com
首页 > 其他好文 > 详细

CriminalIntent项目的迭代

时间:2017-10-15 00:33:43      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:接下来   exec   添加   schema   一个   .so   格式化   lint   mysq   

SQLite数据库

SQLite是类似于MySQL和Postgresql的开源关系型数据库。不同于其他数据库的是,SQLite使用单个文件存储数据,使用SQLite库读取数据。
Android标准库包含SQLite库以及配套的一些Java辅助类。

创建数据库前,首先要清楚存储什么样的数据。CriminalIntent应用要保存的是一条条crime记录,这需要定义如图所示的 crimes 数据表。
技术分享

定义 CrimeTable 内部类(CrimeDbSchema.java)

public class CrimeDbSchema {
public static final class CrimeTable {
public static final String NAME = "crimes";
}
}

CrimeTable 内部类唯一的用途就是定义描述数据表元素的 String 常量。首先要定义的是数据库表名(CrimeTable.NAME)。
接下来定义数据表字段

定义数据表字段(CrimeDbSchema.java)

public static final class Cols {
public static final String UUID = "uuid";
public static final String TITLE = "title";
public static final String DATE = "date";
public static final String SOLVED = "solved";
}

创建初始数据库

定 义 完 数 据 库 schema , 就 可 以 创 建 数 据 库 了 。 openOrCreateDatabase(...) 和databaseList() 方法是Android提供的 Context 底层方法,
可以用来打开数据库文件并将其转换为 SQLiteDatabase 实例。

创建 CrimeBaseHelper 类(CrimeBaseHelper.java)

public class CrimeBaseHelper extends SQLiteOpenHelper {
    private static final int VERSION = 1;
    private static final String DATABASE_NAME = "crimeBase.db";
    public CrimeBaseHelper(Context context) {
    super(context, DATABASE_NAME, null, VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

打开 SQLiteDatabase (CrimeLab.java)

public class CrimeLab {
    private static CrimeLab sCrimeLab;
    private List<Crime> mCrimes;
    private Context mContext;
    private SQLiteDatabase mDatabase;
    ...
    private CrimeLab(Context context) {
    mContext = context.getApplicationContext();
    mDatabase = new CrimeBaseHelper(mContext)
    .getWritableDatabase();
    mCrimes = new ArrayList<>();
}

onCreate(SQLiteDatabase) 方法负责创建初始数据库;

onUpgrade(SQLiteDatabase, int, int) 方法负责与升级相关的工作。

编写SQL创建初始代码(CrimeBaseHelper.java)

public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + CrimeDbSchema.CrimeTable.NAME);
}

创建crime表(CrimeBaseHelper.java)

db.execSQL("create table " + CrimeTable.NAME + "(" +
" _id integer primary key autoincrement, " +
CrimeTable.Cols.UUID + ", " +
CrimeTable.Cols.TITLE + ", " +
CrimeTable.Cols.DATE + ", " +
CrimeTable.Cols.SOLVED +
")"
);

写入数据库

负责处理数据库写入和更新操作的辅助类是 ContentValues 。它是个键值存储类,类似于
Java的 HashMap 和前面用过的 Bundle 。不同的是, ContentValues 只能用于处理SQLite数据。

创建 ContentValues (CrimeLab.java)

private static ContentValues getContentValues(Crime crime) {
    ContentValues values = new ContentValues();
    values.put(CrimeTable.Cols.UUID, crime.getId().toString());
    values.put(CrimeTable.Cols.TITLE, crime.getTitle());
    values.put(CrimeTable.Cols.DATE, crime.getDate().getTime());
    values.put(CrimeTable.Cols.SOLVED, crime.isSolved() ? 1 : 0);
    return values;
}

插入记录(CrimeLab.java)

public void addCrime(Crime c) {
    ContentValues values = getContentValues(c);
    mDatabase.insert(CrimeTable.NAME, null, values);
}

insert(String, String, ContentValues) 方法有两个重要的参数,
传入的第一个参数是数据库表名,最后一个是要写入的数据。

更新记录(CrimeLab.java)

public void updateCrime(Crime crime) {
    String uuidString = crime.getId().toString();
    ContentValues values = getContentValues(crime);
    mDatabase.update(CrimeTable.NAME, values,
    CrimeTable.Cols.UUID + " = ?",
    new String[] { uuidString });
}

update(String, ContentValues, String, String[]) 更新方法类似于 insert(...) 方法,向其传入要更新的数据表名和为表记录准备的 ContentValues 。
然而,与 insert(...) 方法不同的是,你要确定该更新哪些记录。
具体的做法是:创建 where 子句(第三个参数),然后指定 where 子句中的参数值( String[] 数组参数)。

Crime 数据刷新(CrimeFragment.java)

@Override
public void onPause() {
    super.onPause();
    CrimeLab.get(getActivity())
        .updateCrime(mCrime);
}    

隐式intent

应用运行前,我们无法获知具体陋习细节。因此,必须使用带有占位符(可在应用运行时替换)的格式化字符串。
下面是将要使用的格式化字符串:
<string name="crime_report">%1$s! The crime was discovered on %2$s. %3$s, and %4$s
%1$s 、 %2$s 等特殊字符串即为占位符,它们接受字符串参数。在代码中,我们将调用
getString(...) 方法,并传入格式化字符串资源ID以及另外四个字符串参数(与要替换的占位符顺序一致)。

添加字符串资源(strings.xml)

<string name="crime_report">%1$s!
The crime was discovered on %2$s. %3$s, and %4$s
</string>
<string name="crime_report_solved">The case is solved</string>
<string name="crime_report_unsolved">The case is not solved</string>
<string name="crime_report_no_suspect">there is no suspect.</string>
<string name="crime_report_suspect">the suspect is %s.</string>
<string name="crime_report_subject">CriminalIntent Crime Report</string>
<string name="send_report">Send crime report via</string>

隐式 intent 的组成

(1) 要执行的操作
通常以 Intent 类中的常量来表示。例如,要访问查看某个URL,可以使用 Intent.ACTION_
VIEW ;要发送邮件,可以使用 Intent.ACTION_SEND 。
(2) 要访问数据的位置
这可能是设备以外的资源,如某个网页的URL,也可能是指向某个文件的URI,或者是指向
ContentProvider 中某条记录的某个内容URI(content URI)。

发送消息(CrimeFragment.java)

mReportButton = (Button) v.findViewById(R.id.crime_report);
mReportButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("text/plain");
i.putExtra(Intent.EXTRA_TEXT, getCrimeReport());
i.putExtra(Intent.EXTRA_SUBJECT,
getString(R.string.crime_report_subject));
startActivity(i);
}
});

 

CriminalIntent项目的迭代

标签:接下来   exec   添加   schema   一个   .so   格式化   lint   mysq   

原文地址:http://www.cnblogs.com/mhhs/p/7668976.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!