类数据[Android Training视频系列] 6.3 Saving Data in SQL Databases(保存数据到SQLite)
2013-05-06 20:09
591 查看
今天朋友几篇文章介绍了改类数据的文章. 关联文章的地址
一 主要内容
1.概述
2.义定Schema与Contract
3.用使SQL Helper创立数据库
4.向数据库添加信息
5.从数据库中读取信息
6.删除数据库中的信息
7.更新数据库中的信息
二 翻译载转
对于复重或者结构化的数据(如联系人信息)等保存到DB是个不错的主张。这节课假设你已悉熟SQL数据库的作操。在Android上可能会用使到的APIs,可以从android.database.sqlite包中找到。
Contract Clsss是一些常量的器容。它义定了例如URIs, 表名,列名等。这个contract类答应你在同一个包下与其他类用使一样的常量。 它让你只须要在一个地方修改列名,然后这个列名以可就动自传递给你个整code。
一个织组你的contract类的好方法是在你的类的根层级义定一些全局变量,然后为每个table来创立内部类。
Note: 通过现实
例如,上面的例子义定了表名与这个表的列名:
static
abstract
class
FeedEntry
implements
BaseColumns
{
public
static
final
String
TABLE_NAME
=
"entry"
;
public
static
final
String
COLUMN_NAME_ENTRY_ID
=
"entryid"
;
public
static
final
String
COLUMN_NAME_TITLE
=
"title"
;
public
static
final
String
COLUMN_NAME_SUBTITLE
=
"subtitle"
;
...
}
为了止防一些人不小心实例化contract类,像上面一样给一个空的构造器。
private
FeedReaderContract
()
{}
Create a Database Using a SQL Helper [用使SQL Helper创立DB]
当你义定好了你的DB应当是什么样以后,你应当现实那些创立与维护db与table的方法。上面是一些典范的创立与删除table的语句。
static
final
String
TEXT_TYPE
=
" TEXT"
;
private
static
final
String
COMMA_SEP
=
","
;
private
static
final
String
SQL_CREATE_ENTRIES
=
"CREATE TABLE "
+
FeedReaderContract
.
FeedEntry
.
TABLE_NAME
+
" ("
+
FeedReaderContract
.
FeedEntry
.
_ID
+
" INTEGER PRIMARY KEY,"
+
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_ENTRY_ID
+
TEXT_TYPE
+
COMMA_SEP
+
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_TITLE
+
TEXT_TYPE
+
COMMA_SEP
+
...
// Any other options for the CREATE command
" )"
;
private
static
final
String
SQL_DELETE_ENTRIES
=
"DROP TABLE IF EXISTS "
+
TABLE_NAME_ENTRIES
;
就像保存文件到备设的 internal storage 一样,Android会保存db到你的程序的private的空间上。你的数据是受护保的,因为那些区域默许是私有的,不可被其他程序所拜访。
在
Note: 因为那些作操是能可很耗时的,请确保你在background thread(
为了用使
例如,上面是一个现实了
class
FeedReaderDbHelper
extends
SQLiteOpenHelper
{
// If you change the database schema, you must increment the database version.
public
static
final
int
DATABASE_VERSION
=
1
;
public
static
final
String
DATABASE_NAME
=
"FeedReader.db"
;
public
FeedReaderDbHelper
(
Context
context
)
{
super
(
context
,
DATABASE_NAME
,
null
,
DATABASE_VERSION
);
}
public
void
onCreate
(
SQLiteDatabase
db
)
{
db
.
execSQL
(
SQL_CREATE_ENTRIES
);
}
public
void
onUpgrade
(
SQLiteDatabase
db
,
int
oldVersion
,
int
newVersion
)
{
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db
.
execSQL
(
SQL_DELETE_ENTRIES
);
onCreate
(
db
);
}
public
void
onDowngrade
(
SQLiteDatabase
db
,
int
oldVersion
,
int
newVersion
)
{
onUpgrade
(
db
,
oldVersion
,
newVersion
);
}
}
为了拜访你的db,须要实例化你的
每日一道理
共和国迎来了她五十诞辰。五十年像一条长河,有急流也有缓流;五十年像一幅长卷,有冷色也有暖色;五十年像一首乐曲,有低音也有高音;五十年像一部史诗,有痛苦也有欢乐。长河永远奔流,画卷刚刚展开,乐曲渐趋高潮,史诗还在续写。我们的共和国正迈着坚定的步伐,跨入新时代。
mDbHelper
=
new
FeedReaderDbHelper
(
getContext
());
Put Information into a Database [添加信息到DB]
通过传递一个
SQLiteDatabase
db
=
mDbHelper
.
getWritableDatabase
();
// Create a new map of values, where column names are the keys
ContentValues
values
=
new
ContentValues
();
values
.
put
(
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_ENTRY_ID
,
id
);
values
.
put
(
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_TITLE
,
title
);
values
.
put
(
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_CONTENT
,
content
);
// Insert the new row, returning the primary key value of the new row
long
newRowId
;
newRowId
=
db
.
insert
(
FeedReaderContract
.
FeedEntry
.
TABLE_NAME
,
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_NULLABLE
,
values
);
db
=
mDbHelper
.
getReadableDatabase
();
// Define a
projection
that specifies which columns from the database
// you will actually use after this query.
String
[]
projection
=
{
FeedReaderContract
.
FeedEntry
.
_ID
,
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_TITLE
,
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_UPDATED
,
...
};
// How you want the results sorted in the resulting Cursor
String
sortOrder
=
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_UPDATED
+
" DESC"
;
Cursor
c
=
db
.
query
(
FeedReaderContract
.
FeedEntry
.
TABLE_NAME
,
// The table to query
projection
,
// The columns to return
selection
,
// The columns for the WHERE clause
selectionArgs
,
// The values for the WHERE clause
null
,
// don't group the rows
null
,
// don't filter by row groups
sortOrder
// The sort order
);
上面是演示如何从course对象中读取数据信息:
.
moveToFirst
();
long
itemId
=
cursor
.
getLong
(
cursor
.
getColumnIndexOrThrow
(
FeedReaderContract
.
FeedEntry
.
_ID
)
);
Delete Information from a Database [删除DB中的信息]
和询查信息一样,删除数据,一样须要供给一些删除准标。DB的API供给了一个止防SQL入注的制机来创立询查与删除准标。
SQL Injection[随着B/S式模应用开发的开展,用使这类式模编写应用程序的程序员也越来越多。但是由于程序员的水平及验经也齐不差参,相当大一分部程序员在编写代码的时候,没有对户用入输数据的合法性停止判断,使应用程序存在安全隐患。户用可以提交一段数据库询查代码,根据程序返回的结果,取得某些他想知得的数据,这就是所谓的SQL Injection,即SQL入注。]
这个制机把询查语句划分为选项款条与选项参数两分部。款条分部义定了询查的列是怎么样的,参数分部用来测试是不是符合面前的款条。[这里翻译的怪怪的,附上原文,The clause defines the columns to look at, and also allows you to combine column tests. The arguments are values to test against that are bound into the clause.] 因为理处的结果与常通的SQL语句不同,这样可以防止SQL入注题问。
String
selection
=
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_ENTRY_ID
+
" LIKE ?"
;
// Specify arguments in placeholder order.
String
[]
selelectionArgs
=
{
String
.
valueOf
(
rowId
)
};
// Issue SQL statement.
db
.
delete
(
table_name
,
mySelection
,
selectionArgs
);
更新作操结合了插入与删除的语法。
db
=
mDbHelper
.
getReadableDatabase
();
// New value for one column
ContentValues
values
=
new
ContentValues
();
values
.
put
(
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_TITLE
,
title
);
// Which row to update, based on the ID
String
selection
=
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_ENTRY_ID
+
" LIKE ?"
;
String
[]
selelectionArgs
=
{
String
.
valueOf
(
rowId
)
};
int
count
=
db
.
update
(
FeedReaderDbHelper
.
FeedEntry
.
TABLE_NAME
,
values
,
selection
,
selectionArgs
);
三 视频解讲
http://www.eyeandroid.com/thread-14567-1-1.html
文章结束给大家分享下程序员的一些笑话语录:
古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟
一 主要内容
1.概述
2.义定Schema与Contract
3.用使SQL Helper创立数据库
4.向数据库添加信息
5.从数据库中读取信息
6.删除数据库中的信息
7.更新数据库中的信息
二 翻译载转
对于复重或者结构化的数据(如联系人信息)等保存到DB是个不错的主张。这节课假设你已悉熟SQL数据库的作操。在Android上可能会用使到的APIs,可以从android.database.sqlite包中找到。
Define a Schema and Contract [义定Schema与Contract]
SQL中一其中要重的念概是schema:一种DB结构的正式声明。schema是从你创立DB的SQL语句中生成的。你可能会现发创立一个创立一个随同类(companion class)是很益有的,这个类成为合约类(contract class),它用一种系统化并且动自生成档文的方法,示显指定了你的schema款式。Contract Clsss是一些常量的器容。它义定了例如URIs, 表名,列名等。这个contract类答应你在同一个包下与其他类用使一样的常量。 它让你只须要在一个地方修改列名,然后这个列名以可就动自传递给你个整code。
一个织组你的contract类的好方法是在你的类的根层级义定一些全局变量,然后为每个table来创立内部类。
Note: 通过现实
BaseColumns的口接,你的内部类可以继承到一个名为_ID的主键,这个对于Android面里的一些相似cursor adaptor类是很有要必的。这样够能使得你的DB与Android的framework够能很好的相容。
例如,上面的例子义定了表名与这个表的列名:
public
static
abstract
class
FeedEntry
implements
BaseColumns
{
public
static
final
String
TABLE_NAME
=
"entry"
;
public
static
final
String
COLUMN_NAME_ENTRY_ID
=
"entryid"
;
public
static
final
String
COLUMN_NAME_TITLE
=
"title"
;
public
static
final
String
COLUMN_NAME_SUBTITLE
=
"subtitle"
;
...
}
为了止防一些人不小心实例化contract类,像上面一样给一个空的构造器。
// Prevents the FeedReaderContract class from being instantiated.
private
FeedReaderContract
()
{}
Create a Database Using a SQL Helper [用使SQL Helper创立DB]
当你义定好了你的DB应当是什么样以后,你应当现实那些创立与维护db与table的方法。上面是一些典范的创立与删除table的语句。
private
static
final
String
TEXT_TYPE
=
" TEXT"
;
private
static
final
String
COMMA_SEP
=
","
;
private
static
final
String
SQL_CREATE_ENTRIES
=
"CREATE TABLE "
+
FeedReaderContract
.
FeedEntry
.
TABLE_NAME
+
" ("
+
FeedReaderContract
.
FeedEntry
.
_ID
+
" INTEGER PRIMARY KEY,"
+
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_ENTRY_ID
+
TEXT_TYPE
+
COMMA_SEP
+
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_TITLE
+
TEXT_TYPE
+
COMMA_SEP
+
...
// Any other options for the CREATE command
" )"
;
private
static
final
String
SQL_DELETE_ENTRIES
=
"DROP TABLE IF EXISTS "
+
TABLE_NAME_ENTRIES
;
就像保存文件到备设的 internal storage 一样,Android会保存db到你的程序的private的空间上。你的数据是受护保的,因为那些区域默许是私有的,不可被其他程序所拜访。
在
SQLiteOpenHelper类中有一些很用有的APIs。当你用使这个类来做一些与你的db有关的作操时,系统会对那些有可能比拟耗时的作操(例如创立与更新等)在真正须要的时候才去行执,而不是在app刚启动的时候就去做那些动作。你所须要做的仅仅是行执
getWritableDatabase()或者
getReadableDatabase().
Note: 因为那些作操是能可很耗时的,请确保你在background thread(
AsyncTaskor
IntentService)面里去行执
getWritableDatabase()或者
getReadableDatabase()。
为了用使
SQLiteOpenHelper, 你须要创立一个子类并写重
onCreate(),
onUpgrade()与
onOpen()等callback方法。你许也还须要现实
onDowngrade(), 但是这并非必须的。
例如,上面是一个现实了
SQLiteOpenHelper类的例子:
public
class
FeedReaderDbHelper
extends
SQLiteOpenHelper
{
// If you change the database schema, you must increment the database version.
public
static
final
int
DATABASE_VERSION
=
1
;
public
static
final
String
DATABASE_NAME
=
"FeedReader.db"
;
public
FeedReaderDbHelper
(
Context
context
)
{
super
(
context
,
DATABASE_NAME
,
null
,
DATABASE_VERSION
);
}
public
void
onCreate
(
SQLiteDatabase
db
)
{
db
.
execSQL
(
SQL_CREATE_ENTRIES
);
}
public
void
onUpgrade
(
SQLiteDatabase
db
,
int
oldVersion
,
int
newVersion
)
{
// This database is only a cache for online data, so its upgrade policy is
// to simply to discard the data and start over
db
.
execSQL
(
SQL_DELETE_ENTRIES
);
onCreate
(
db
);
}
public
void
onDowngrade
(
SQLiteDatabase
db
,
int
oldVersion
,
int
newVersion
)
{
onUpgrade
(
db
,
oldVersion
,
newVersion
);
}
}
为了拜访你的db,须要实例化你的
SQLiteOpenHelper的子类:
每日一道理
共和国迎来了她五十诞辰。五十年像一条长河,有急流也有缓流;五十年像一幅长卷,有冷色也有暖色;五十年像一首乐曲,有低音也有高音;五十年像一部史诗,有痛苦也有欢乐。长河永远奔流,画卷刚刚展开,乐曲渐趋高潮,史诗还在续写。我们的共和国正迈着坚定的步伐,跨入新时代。
FeedReaderDbHelper
mDbHelper
=
new
FeedReaderDbHelper
(
getContext
());
Put Information into a Database [添加信息到DB]
通过传递一个
ContentValues对象到
insert()方法:
// Gets the data repository in write mode
SQLiteDatabase
db
=
mDbHelper
.
getWritableDatabase
();
// Create a new map of values, where column names are the keys
ContentValues
values
=
new
ContentValues
();
values
.
put
(
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_ENTRY_ID
,
id
);
values
.
put
(
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_TITLE
,
title
);
values
.
put
(
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_CONTENT
,
content
);
// Insert the new row, returning the primary key value of the new row
long
newRowId
;
newRowId
=
db
.
insert
(
FeedReaderContract
.
FeedEntry
.
TABLE_NAME
,
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_NULLABLE
,
values
);
insert()方法的第一个参数是table名,第二个参数会使得系统动自对那些
ContentValues没有供给数据的列填充数据为null,如果第二个参数传递的是null,那么系统则不会对那些没有供给数据的列停止填充。
Read Information from a Database [从DB中读取信息]
为了从DB中读取数据,须要用使, java.lang.String, java.lang.String[], java.lang.String, java.lang.String, java.lang.String, java.lang.String)]query()方法, 传递你须要询查的件条。询查后会返回一个
Cursor对象。
SQLiteDatabase
db
=
mDbHelper
.
getReadableDatabase
();
// Define a
projection
that specifies which columns from the database
// you will actually use after this query.
String
[]
projection
=
{
FeedReaderContract
.
FeedEntry
.
_ID
,
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_TITLE
,
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_UPDATED
,
...
};
// How you want the results sorted in the resulting Cursor
String
sortOrder
=
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_UPDATED
+
" DESC"
;
Cursor
c
=
db
.
query
(
FeedReaderContract
.
FeedEntry
.
TABLE_NAME
,
// The table to query
projection
,
// The columns to return
selection
,
// The columns for the WHERE clause
selectionArgs
,
// The values for the WHERE clause
null
,
// don't group the rows
null
,
// don't filter by row groups
sortOrder
// The sort order
);
上面是演示如何从course对象中读取数据信息:
cursor
.
moveToFirst
();
long
itemId
=
cursor
.
getLong
(
cursor
.
getColumnIndexOrThrow
(
FeedReaderContract
.
FeedEntry
.
_ID
)
);
Delete Information from a Database [删除DB中的信息]
和询查信息一样,删除数据,一样须要供给一些删除准标。DB的API供给了一个止防SQL入注的制机来创立询查与删除准标。
SQL Injection[随着B/S式模应用开发的开展,用使这类式模编写应用程序的程序员也越来越多。但是由于程序员的水平及验经也齐不差参,相当大一分部程序员在编写代码的时候,没有对户用入输数据的合法性停止判断,使应用程序存在安全隐患。户用可以提交一段数据库询查代码,根据程序返回的结果,取得某些他想知得的数据,这就是所谓的SQL Injection,即SQL入注。]
这个制机把询查语句划分为选项款条与选项参数两分部。款条分部义定了询查的列是怎么样的,参数分部用来测试是不是符合面前的款条。[这里翻译的怪怪的,附上原文,The clause defines the columns to look at, and also allows you to combine column tests. The arguments are values to test against that are bound into the clause.] 因为理处的结果与常通的SQL语句不同,这样可以防止SQL入注题问。
/ Define 'where' part of query.
String
selection
=
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_ENTRY_ID
+
" LIKE ?"
;
// Specify arguments in placeholder order.
String
[]
selelectionArgs
=
{
String
.
valueOf
(
rowId
)
};
// Issue SQL statement.
db
.
delete
(
table_name
,
mySelection
,
selectionArgs
);
Update a Database [更新数据]
当你须要修改DB中的某些数据时,用使)]update()方法。
更新作操结合了插入与删除的语法。
SQLiteDatabase
db
=
mDbHelper
.
getReadableDatabase
();
// New value for one column
ContentValues
values
=
new
ContentValues
();
values
.
put
(
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_TITLE
,
title
);
// Which row to update, based on the ID
String
selection
=
FeedReaderContract
.
FeedEntry
.
COLUMN_NAME_ENTRY_ID
+
" LIKE ?"
;
String
[]
selelectionArgs
=
{
String
.
valueOf
(
rowId
)
};
int
count
=
db
.
update
(
FeedReaderDbHelper
.
FeedEntry
.
TABLE_NAME
,
values
,
selection
,
selectionArgs
);
三 视频解讲
http://www.eyeandroid.com/thread-14567-1-1.html
文章结束给大家分享下程序员的一些笑话语录:
古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟
相关文章推荐
- [Android Training视频系列] 6.3 Saving Data in SQL Databases(保存数据到SQLite)
- Android学习笔记-保存数据到SQL数据库中(Saving Data in SQL Databases)
- [Android Training视频系列] 6.2 Saving Files(保存文件)
- saving data - Saving Data in SQL Databases
- 翻译Saving Data in SQL Databases
- Saving Data in SQL Databases
- Saving Data in SQL Databases-by小雨
- 14Saving Data in SQL Databases(使用SQLite数据库)
- Saving Data in SQL Databases
- [Android Training视频系列] 6.2 Saving Files(保存文件)
- Saving Data in SQL Databases
- 【Android Training - 04】保存数据 [ Lesson 3 - 保存数据到SQLite]
- [Android Training视频系列] 8.2 Managing Audio Focus
- Android数据存储之SQLite中常用的SQL语句
- Android训练课程(Android Training) - 使用Volley传输网络数据(Transmitting Network Data Using Volley)
- android创建数据库(SQLite)保存图片示例ZZ 分类: Android数据存储 2015-03-22 09:58 41人阅读 评论(0) 收藏
- ORACLE HANDBOOK系列之六:ODP.NET与复杂的PL/SQL数据类型(Using ODP.NET To Deal With Complex PLSQL Data Types)
- Android官方Training学习——在SQL数据库中保存数据
- (转)【Android游戏开发十三】(保存游戏数据 [下文])详解SQLite存储方式,并把SQLite的数据库文件存储在SD卡中!!!
- [Android Training视频系列] 8.1 Controlling Your App’s Volume and Playback