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タイプで、インクリメントされます。
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;

    }



}