Androidデータ格納のSQLit
41077 ワード
SQLiteSQLiteはオープンソース、ライト級、埋め込み型、関係型データベースです。2000年にD.Richard Hippからリリースされ、Java、Net、PHP、Ruby、Python、Perl、Cなどのほとんどの近代的なプログラミング言語をサポートし、Windows、Linux、Unix、Mac OS、Android、IOSなどのほとんどの主流のオペレーティングシステムプラットフォームをサポートします。SQLiteの特性: 1.ACID事務2.ゼロプロファイル–インストールと管理構成が不要3.単一ディスクファイルに格納された完全なデータベース4.データベースファイルは、バイト順のマシン間で自由に共有できる5.データベースサイズは2 TB 6までサポートします。十分に小さいです。約3万行Cコード、250 K 7.流行のデータベースより大部分の普通データベースで操作するのが早い8.簡単です。楽なAPI 9.TCLバインディングを含み、Wrapperを通じて他の言語のバインディングをサポートしています。良好な注釈のソースコードは90%以上のテストカバレッジを持っています。独立:12.Source完全なOpenがありません。販売することを含みます。様々な開発言語、C、PHP、Perl、Java、ASP.NET、PythonSQLigel、サポート、Pythone SQLiGETEXTとBLOBデータタイプは、それぞれ空の値、整数値、浮動小数点値、文字列テキスト、バイナリオブジェクトを表します。SQLiteは関数のセットを提供しています。詳細は以下の通りです。http://www.sqlite.org/lang_datefunc.このようなシンプルなデータタイプのデザインは組み込み機器の要求により適合しています。SQLiteの詳細については、参照してください。http://www.sqlite.org/データベースの作成と削除 パッケージのクラスはSQLiteOpenHelperを継承します。 コンストラクタにデータベース名とデータベースバージョン番号が入ってきます。データベースが作成されたときにオンクリアー(SQLiteDatabase db)方法を呼び出します。 データベースのバージョン番号が変更された場合は、OUpgrade(SQLiteDatabase db、int oldVersion、int newVersion)を呼び出すことができます。ソフトウェアゲームのアップグレード後に対応する処理をして、インストールデータベースの変更によるエラーを避けることができます。 SQLiteOpenHelperのget Readable Database()メソッドを呼び出してデータベースを作成し、データベースが存在しない場合はSQLiteDatabaseオブジェクトを作成し、データベースが存在する場合は作成せずにSQLiteDatabaseオブジェクトに戻ります。 DatabaseHelperクラスをカプセル化しました。SQLiteOpenHelperを継承します。 データベース内のテーブルの追加と削除 データベースは複数のデータテーブルから構成されていますが、データベースのテーブルを追加するとデータベース文のcreateテーブル名(内容)を使って追加できます。 ここでデータベースを作成するステートメントを示します。名前がgameInfoテーブルに含まれているフィールドは_です。IDはINTEGERタイプで、インクリメントされます。
SQLiteOpenHelper類の紹介 SQLiteOpenHelperはSQLiteDatabaseのヘルプクラスで、データベースの作成とバージョンの更新を管理します。 一般的にクラスを作ってそれを継承して、それを実現するonCreateとonUpgrade方法です。 メソッド名の説明 SQLiteOpenHelper(Conttext context,String name,SQLiteDatabase.rasor Factory,int version)の構造方法は、一般的にクリエイティブを伝えるものです。 建てられたデータベースの名前はパラメータです。 onCreate(SQLiteDatabase db)データベース作成時に呼び出します。 onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)バージョンの更新時に呼び出します。 get Readable Database()は、読み取り専用データベースを作成または開くことができます。 ここでは、SQLiteOpenHelperクラスのget Readable Databaseを呼び出すことにより、データベースを作成することができます。データベースのデフォルトの保存経路は、データベースを作成することができます。
SQLiteOpenHelperを使って、SDカードのデータベースを管理します。
Androidで持参したSQLiteOpenHelperを使用するとデータベースの作成と管理ができますが、2つの制限があります。(1)データベースはメモリカードに作成され、サイズが制限されています。作成位置は/data/data/アプリケーション名/databasesにあります。(2)Root権限を取得できないと、作成したデータベースを直接見ることができません。
SQLiteOpenHelper(Conttext context、String name、SQLiteDatabase.rasor Factory factory、int version)はパラメータcontextを通じて、sdカード上でデータベースを作成するように設定できます。詳細は下記のコードを見てください。
SQLiteDatabase類は私達のために多くの方法を提供していますが、一般的な方法は以下の通りです。 (戻り値)方法名方法説明 (int)delete(String table,String whereClause,String[]whereArgs)データ行を削除するのに便利な方法 (long)insertデータ行を追加する便利な方法 (int)udate(String table,ContentValues values,String whereClause,String[]whereArgs)データ行を更新する便利な方法 (void)execSQL(String sql)はSQL文を実行します。selectまたは他のsql文とすることができます。 (void)close()データベースを閉じる (Cursor)query(String table,String[]columns,String selection,String[]selectionags,String groupBy,String having, String orderBy,String limitクエリーで指定されたデータテーブルは、游び付きのデータセットに戻ります。 (Curor)rawQuery(String sql,String[selectiving Args)は、予め設定されたSQL文を実行し、ラベル付きデータセット(上の文と最大の違いはSQL注入防止)データの添削調査を2つの経路で行うことができます。insert方法を使用します。
DBContectWrapper.classはContectWrapperを継承し、SQLiteOpenHelperがメモリとSDでデータベースDBHelper.classを作成してSQLiteOpenHelper類を継承し、データベースSQLiteの基本操作DatabaseColumn.classを実現し、BaseColumnsインターフェースを実現し、クラスの作成によって、Delation*Colusel*c*Colusel*を作成します。***************************************************
public class DatabaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "mydata.db"; //
private static final int version = 1; //
public DatabaseHelper(Context context) {
super(context, DB_NAME, null, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table user(_id INTEGER PRIMARY KEY AUTOINCREMENT , username varchar(20) not null , password varchar(60) not null );";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
SQLiteOpenHelper類の紹介 SQLiteOpenHelperはSQLiteDatabaseのヘルプクラスで、データベースの作成とバージョンの更新を管理します。 一般的にクラスを作ってそれを継承して、それを実現するonCreateとonUpgrade方法です。 メソッド名の説明 SQLiteOpenHelper(Conttext context,String name,SQLiteDatabase.rasor Factory,int version)の構造方法は、一般的にクリエイティブを伝えるものです。 建てられたデータベースの名前はパラメータです。 onCreate(SQLiteDatabase db)データベース作成時に呼び出します。 onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)バージョンの更新時に呼び出します。 get Readable Database()は、読み取り専用データベースを作成または開くことができます。 ここでは、SQLiteOpenHelperクラスのget Readable Databaseを呼び出すことにより、データベースを作成することができます。データベースのデフォルトの保存経路は、データベースを作成することができます。
DatabaseHelper database = new DatabaseHelper(this);// Activity this
SQLiteDatabase db = null;
db = database.getReadalbeDatabase();
同時にデータベースファイルをSDカードに保存したいなら、自分でデータベースファイルを作成します。<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE”/>
File path = new File("/sdcard/ ");//
File f = new File("/sdcard/ / .db");//
if (!path.exists()) {// false
path.mkdirs();//
}
if (!f.exists()) {// false
try {
f.createNewFile();//
} catch (IOException e) {
e.printStackTrace();
}
}
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(f, null);
// :SQLiteDatabase.openDatabase(fpath, null, writable ? SQLiteDatabase.OPEN_READWRITE : SQLiteDatabase.OPEN_READONLY)
db = database.getWritableDatabase();
SDカード上のデータベースファイルを操作することができます。SQLiteOpenHelperを使って、SDカードのデータベースを管理します。
Androidで持参したSQLiteOpenHelperを使用するとデータベースの作成と管理ができますが、2つの制限があります。(1)データベースはメモリカードに作成され、サイズが制限されています。作成位置は/data/data/アプリケーション名/databasesにあります。(2)Root権限を取得できないと、作成したデータベースを直接見ることができません。
SQLiteOpenHelper(Conttext context、String name、SQLiteDatabase.rasor Factory factory、int version)はパラメータcontextを通じて、sdカード上でデータベースを作成するように設定できます。詳細は下記のコードを見てください。
SQLiteDatabase類は私達のために多くの方法を提供していますが、一般的な方法は以下の通りです。 (戻り値)方法名方法説明 (int)delete(String table,String whereClause,String[]whereArgs)データ行を削除するのに便利な方法 (long)insertデータ行を追加する便利な方法 (int)udate(String table,ContentValues values,String whereClause,String[]whereArgs)データ行を更新する便利な方法 (void)execSQL(String sql)はSQL文を実行します。selectまたは他のsql文とすることができます。 (void)close()データベースを閉じる (Cursor)query(String table,String[]columns,String selection,String[]selectionags,String groupBy,String having, String orderBy,String limitクエリーで指定されたデータテーブルは、游び付きのデータセットに戻ります。 (Curor)rawQuery(String sql,String[selectiving Args)は、予め設定されたSQL文を実行し、ラベル付きデータセット(上の文と最大の違いはSQL注入防止)データの添削調査を2つの経路で行うことができます。insert方法を使用します。
ContentValues cv = new ContentValues();// ContentValues
cv.put("username","Jack Johnson");//
cv.put("password","iLovePopMusic"); //
db.insert("user",null,cv);//
2.execSQL方式を使って実現する。 String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');// SQL
db.execSQL(sql);// SQL
データの削除は同様に2つの方法で実現できます。 String whereClause = "username=?";//
String[] whereArgs = {"Jack Johnson"};//
db.delete("user",whereClause,whereArgs);//
execSQL方式を使用した実現 String sql = "delete from user where username='Jack Johnson'";// SQL
db.execSQL(sql);//
データの修正は同じですか?それとも2つの方法ですか? ContentValues cv = new ContentValues();// ContentValues
cv.put("password","iHatePopMusic");//
String whereClause = "username=?";//
String[] whereArgs = {"Jack Johnson"};//
db.update("user",cv,whereClause,whereArgs);//
execSQL方式を使用した実現 String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'";// SQL
db.execSQL(sql);//
データクエリのデータクエリは前のいくつかの方法に比べて複雑です。クエリには多くの条件が含まれます。 public Curser query(String table、String[]columns、String selection、String[]selectionags、String groupBy、String having、String ordersBy、String limit)各パラメータ説明: テーブル名 colums:列名配列 セレクション:条件子文は、whereに相当します。 セレクションアーツ:条件文のパラメータ配列 グループ分け having:グループ化条件 orderBy:ソート類 limit:改ページクエリの制限 Currsor:戻り値は、結果セットのResultSetに相当し、遊覧標識(Curor)に対しても多くの方法が提供されている。 方法名方法説明 get Count()総記録条数 isfirst()は第一条の記録かどうかを判断する。 isLast()最後のレコードかどうかを判断する。 moveToFirst()は第一の記録に移動します。 moveToLast()は最後のレコードに移動します。 move(int offset)は指定されたレコードに移動します。 moveToNext()は驚きの記録に移動します。 moveToProvious()は前のレコードに移動します。 get ColumnIndex(String columnName)は、指定された列インデックスのintタイプ値を取得してコードを実現します。Cursor c = db.query("user",null,null,null,null,null,null);//
if(c.moveToFirst()){//
for(int i=0;i<c.getCount();i++){
c.move(i);//
String username = c.getString(c.getColumnIndex("username");
String password = c.getString(c.getColumnIndex("password"));
}
}
rawQueryによるパラメータ照会 Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"});
if(cursor.moveToFirst()) {
String password = c.getString(c.getColumnIndex("password"));
}
/**ここにいくつかの有用なSQL文があります。*********************************************************************************を検索するデータベースにはどのようなテーブルがありますか? テーブルフィールドの情報pragmaテーブルの名前('テーブル名')/************************************************/**
: Cursor , Cursor,Cursor 。
Cursor , , , Activity startManagingCursor(Cursor cursor) ,
Activity Cursor 。
startManagingCursor Activity Cursor , Activity Cursor deactivate , ,
Activity Cursor requery , Activity , Cursor 。
Cursor: CursorWrapper Cursor , , CursorWrapper Cursor 。
Cursor Cursor , Cursor , CursorWrapper ,
SimpleCursorAdapter 。
Cursor : , “_id” , SimpleCursorAdapter , ?
SQLite , “_id” 。
:
, ;
, , :SELECT id AS _id FROM person;
, CursorWrapper
**/
Cursor c = mgr.queryTheCursor();
startManagingCursor(c); // activity Cursor
CursorWrapper cursorWrapper = new CursorWrapper(c) {
@Override
public String getString(int columnIndex) {
if (columnName.equals("_id")) { // _id
return super.getColumnIndex("id");
}
return super.getColumnIndexOrThrow(columnName);
};
// "_id"
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursorWrapper,
new String[]{"name", "info"}, new int[]{android.R.id.text1, android.R.id.text2});
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
注意:データベースを使用した後、close()/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////DBContectWrapper.classはContectWrapperを継承し、SQLiteOpenHelperがメモリとSDでデータベースDBHelper.classを作成してSQLiteOpenHelper類を継承し、データベースSQLiteの基本操作DatabaseColumn.classを実現し、BaseColumnsインターフェースを実現し、クラスの作成によって、Delation*Colusel*c*Colusel*を作成します。***************************************************
public class DBContextWrapper extends ContextWrapper {
public DBContextWrapper(Context base) {
super(base);
}
private boolean isSDcardExist() {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
@Override
public File getDatabasePath(String name) {
if (isSDcardExist()) {
String path = Environment.getExternalStorageDirectory() + "/Android/data/" + getPackageName();
if (!(new File(path)).exists()) {
(new File(path)).mkdirs();
}
File dbFile = new File(path + "/" + name);
if (!dbFile.exists()) {
try {
dbFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
dbFile = null;
}
}
return dbFile;
}
return super.getDatabasePath(name);
}
@Override
public boolean deleteDatabase(String name) {
return super.deleteDatabase(name);
}
/**
*
* 2.3
* @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory)
*/
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
CursorFactory factory) {
if(isSDcardExist())
return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
return super.openOrCreateDatabase(name, mode, factory);
}
/**
*
* TODO
* @see android.content.ContextWrapper#openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase.CursorFactory, android.database.DatabaseErrorHandler)
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public SQLiteDatabase openOrCreateDatabase(String name, int mode,
CursorFactory factory, DatabaseErrorHandler errorHandler) {
if(isSDcardExist())
return SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
return super.openOrCreateDatabase(name, mode, factory, errorHandler);
}
}
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "eoecn";
private static final int DB_VERSION = 2;
private SQLiteDatabase db;
private static DBHelper mdbHelper;
public static DBHelper getInstance(Context context)
{
if(mdbHelper==null)
{
mdbHelper=new DBHelper(new DBContextWrapper(context));
}
return mdbHelper;
}
private DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
private DBHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
this.db = db;
operateTable(db, "");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
if (oldVersion == newVersion) {
return;
}
operateTable(db, "DROP TABLE IF EXISTS ");
onCreate(db);
}
public void operateTable(SQLiteDatabase db, String actionString) {
Class<DatabaseColumn>[] columnsClasses = DatabaseColumn.getSubClasses();
DatabaseColumn columns = null;
for (int i = 0; i < columnsClasses.length; i++) {
try {
columns = columnsClasses[i].newInstance();
if ("".equals(actionString) || actionString == null) {
db.execSQL(columns.getTableCreateor());
} else {
db.execSQL(actionString + columns.getTableName());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public long insert(String Table_Name, ContentValues values) {
if (db == null)
db = getWritableDatabase();
return db.insert(Table_Name, null, values);
}
/**
*
* @param Table_Name
* @param id
* @return
*/
public int delete(String Table_Name, int id) {
if (db == null)
db = getWritableDatabase();
return db.delete(Table_Name, BaseColumns._ID + "=?",
new String[] { String.valueOf(id) });
}
/**
* @param Table_Name
* @param values
* @param WhereClause
* @param whereArgs
* @return
*/
public int update(String Table_Name, ContentValues values,
String WhereClause, String[] whereArgs) {
if (db == null) {
db = getWritableDatabase();
}
return db.update(Table_Name, values, WhereClause, whereArgs);
}
public Cursor query(String Table_Name, String[] columns, String whereStr,
String[] whereArgs) {
if (db == null) {
db = getReadableDatabase();
}
return db.query(Table_Name, columns, whereStr, whereArgs, null, null,
null);
}
public void closeDb() {
if (db != null) {
db.close();
db = null;
}
}
}
************************************************************************************public abstract class DatabaseColumn implements BaseColumns {
/**
* The identifier to indicate a specific ContentProvider
*/
public static final String AUTHORITY = "cn.eoe.app.provider";
/**
* The database's name
*/
public static final String DATABASE_NAME = "eoecn.db";
/**
* The version of current database
*/
public static final int DATABASE_VERSION = 1;
/**
* Classes's name extends from this class.
*/
public static final String[] SUBCLASSES = new String[] {
"cn.eoe.app.db.BlogColumn", "cn.eoe.app.db.NewsColumn",
"cn.eoe.app.db.DetailColumn", "cn.eoe.app.db.ImageCacheColumn",
"cn.eoe.app.db.RequestCacheColumn" };
public String getTableCreateor() {
return getTableCreator(getTableName(), getTableMap());
}
/**
* Get sub-classes of this class.
*
* @return Array of sub-classes.
*/
@SuppressWarnings("unchecked")
public static final Class<DatabaseColumn>[] getSubClasses() {
ArrayList<Class<DatabaseColumn>> classes = new ArrayList<Class<DatabaseColumn>>();
Class<DatabaseColumn> subClass = null;
for (int i = 0; i < SUBCLASSES.length; i++) {
try {
subClass = (Class<DatabaseColumn>) Class.forName(SUBCLASSES[i]);
classes.add(subClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
continue;
}
}
return classes.toArray(new Class[0]);
}
/**
* Create a sentence to create a table by using a hash-map.
*
* @param tableName
* The table's name to create.
* @param map
* A map to store table columns info.
* @return
*/
private static final String getTableCreator(String tableName,
Map<String, String> map) {
String[] keys = map.keySet().toArray(new String[0]);
String value = null;
StringBuilder creator = new StringBuilder();
creator.append("CREATE TABLE ").append(tableName).append("( ");
int length = keys.length;
for (int i = 0; i < length; i++) {
value = map.get(keys[i]);
creator.append(keys[i]).append(" ");
creator.append(value);
if (i < length - 1) {
creator.append(",");
}
}
creator.append(")");
return creator.toString();
}
abstract public String getTableName();
abstract public Uri getTableContent();
abstract protected Map<String, String> getTableMap();
}
************************************************************************************public class DetailColumn extends DatabaseColumn {
public static final String TABLE_NAME = "detailRecord";
// public static final String KEY_WORD = "key_word";
// public static final String CONTENT_ID = "contentID";
public static final String URL = "url";
public static final String KEY = "key";
public static final String GOOD = "good";
public static final String BAD = "bad";
public static final String COLLECT = "collect";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
+ "/" + TABLE_NAME);
private static final Map<String, String> mColumnMap = new HashMap<String, String>();
static {
mColumnMap.put(_ID, "integer primary key autoincrement");
mColumnMap.put(URL, "text");
mColumnMap.put(KEY, "text");
mColumnMap.put(GOOD, "integer");
mColumnMap.put(BAD, "integer");
mColumnMap.put(COLLECT, "integer");
}
@Override
public String getTableName() {
// TODO Auto-generated method stub
return TABLE_NAME;
}
@Override
public Uri getTableContent() {
// TODO Auto-generated method stub
return CONTENT_URI;
}
@Override
protected Map<String, String> getTableMap() {
// TODO Auto-generated method stub
return mColumnMap;
}
}