Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          數(shù)據(jù)庫SQLite介紹
             
          數(shù)據(jù)庫最經(jīng)典的四個操作 添加、刪除、修改、查找,在處理大量數(shù)據(jù)的時(shí)候使用數(shù)據(jù)庫可以幫我們迅速定位當(dāng)前須要處理的數(shù)據(jù),舉個例子 好比現(xiàn)在要實(shí)現(xiàn)一個搜索功能 用數(shù)據(jù)庫的話只須要其中一個搜索條件 一個數(shù)據(jù)庫語句就可以迅速的在N條數(shù)據(jù)中找到我們需要的數(shù)據(jù),如果不使用數(shù)據(jù)庫那么查找起來會非常麻煩,效率大打折扣,所以在處理大量數(shù)據(jù)的時(shí)候使用數(shù)據(jù)庫是明確的選擇,在Android的開發(fā)中使用的數(shù)據(jù)庫是SQLite ,它是一個輕量級的數(shù)據(jù)庫 、非常小 、 移植性好、效率高、可靠 ,嵌入式設(shè)備因?yàn)槭艿接布l件的限制所以非常適合使用 SQLite  數(shù)據(jù)庫。


          創(chuàng)建與刪除數(shù)據(jù)庫

          封裝一個類去繼承SQLiteOpenHelper  在構(gòu)造函數(shù)中傳入數(shù)據(jù)庫名稱與數(shù)據(jù)庫版本號,數(shù)據(jù)庫被創(chuàng)建的時(shí)候會調(diào)用onCreate(SQLiteDatabase db) 方法,數(shù)據(jù)庫版本號發(fā)生改變的時(shí)候會調(diào)用onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)方法,可以方便的對軟件游戲升級后做出相應(yīng)處理避免覆蓋安裝數(shù)據(jù)庫發(fā)生改變產(chǎn)生的錯誤。調(diào)用SQLiteOpenHelper  的getReadableDatabase()方法去創(chuàng)建數(shù)據(jù)庫,如果數(shù)據(jù)庫不存在則創(chuàng)建 并且返回SQLiteDatabase對象,如果數(shù)據(jù)庫存在則不創(chuàng)建只返回SQLiteDatabase對象。調(diào)用deleteDatabase(DATABASE_NAME)方法 傳入數(shù)據(jù)庫名稱則可刪除數(shù)據(jù)庫。

           

          封裝了一個DatabaseHelper類繼承SQLiteOpenHelper 我使用了設(shè)計(jì)模式中的單例模式來處理這個類,這里說一下單例模式 單例模式是常見的代碼設(shè)計(jì)模式之一 它的好處是在于避免在內(nèi)存中頻繁的實(shí)例化所以將它的對象寫成static 靜態(tài) 這樣它的對象就只有一份存在靜態(tài)內(nèi)存區(qū)使用的時(shí)候只須要通過getInstance()就可以直接拿到這個靜態(tài)對象。
           
          public class DatabaseHelper extends SQLiteOpenHelper {  
              private static DatabaseHelper mInstance = null;  
            
              /** 數(shù)據(jù)庫名稱 **/  
              public static final String DATABASE_NAME = "xys.db";  
            
              /** 數(shù)據(jù)庫版本號 **/  
              private static final int DATABASE_VERSION = 1;  
            
              /**數(shù)據(jù)庫SQL語句 添加一個表**/  
              private static final String NAME_TABLE_CREATE = "create table test("  
                  + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,"+"hp INTEGER DEFAULT 100,"+ "mp INTEGER DEFAULT 100,"  
                  + "number INTEGER);";  
            
              DatabaseHelper(Context context) {  
              super(context, DATABASE_NAME, null, DATABASE_VERSION);  
              }  
                
               /**單例模式**/  
              static synchronized DatabaseHelper getInstance(Context context) {  
              if (mInstance == null) {  
                  mInstance = new DatabaseHelper(context);  
              }  
              return mInstance;  
              }  
            
              @Override  
              public void onCreate(SQLiteDatabase db) {  
              /**向數(shù)據(jù)中添加表**/  
              db.execSQL(NAME_TABLE_CREATE);  
              }  
            
              @Override  
              public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
              /**可以拿到當(dāng)前數(shù)據(jù)庫的版本信息 與之前數(shù)據(jù)庫的版本信息   用來更新數(shù)據(jù)庫**/   
              }  
            
                
              /** 
               * 刪除數(shù)據(jù)庫 
               * @param context 
               * @return 
               */  
              public boolean deleteDatabase(Context context) {  
              return context.deleteDatabase(DATABASE_NAME);  
              }  

          在這個類中使用DatabaseHelper對象 實(shí)現(xiàn)創(chuàng)建與刪除數(shù)據(jù)庫、
           
          public class NewSQLite extends Activity {  
              DatabaseHelper mDbHelper = null;  
              SQLiteDatabase mDb = null;  
              Context mContext = null;  
              @Override  
              protected void onCreate(Bundle savedInstanceState) {  
              setContentView(R.layout.create_sql);  
              mContext = this;  
              //創(chuàng)建DatabaseHelper對象         
              mDbHelper = DatabaseHelper.getInstance(mContext);  
              //調(diào)用getReadableDatabase方法如果數(shù)據(jù)庫不存在 則創(chuàng)建  如果存在則打開   
              mDb= mDbHelper.getReadableDatabase();    
            
              Button button0 = (Button)findViewById(R.id.createDateBase);  
              button0.setOnClickListener(new OnClickListener() {  
                    
                  @Override  
                  public void onClick(View arg0) {  
            
                  Toast.makeText(NewSQLite.this, "成功創(chuàng)建數(shù)據(jù)庫", Toast.LENGTH_LONG).show();    
                  }  
              });  
              Button button1 = (Button)findViewById(R.id.deleteDateBase);  
              button1.setOnClickListener(new OnClickListener() {  
                    
                  @Override  
                  public void onClick(View arg0) {  
                  mDbHelper = DatabaseHelper.getInstance(mContext);  
                  // 調(diào)用getReadableDatabase方法如果數(shù)據(jù)庫不存在 則創(chuàng)建 如果存在則打開   
                  mDb = mDbHelper.getReadableDatabase();  
                  // 關(guān)閉數(shù)據(jù)庫   
                  mDbHelper.close();  
                  // 刪除數(shù)據(jù)庫   
                  mDbHelper.deleteDatabase(mContext);  
                  Toast.makeText(NewSQLite.this, "成功刪除數(shù)據(jù)庫", Toast.LENGTH_LONG).show();    
                  }  
              });  
                
                
                
              super.onCreate(savedInstanceState);  
              }  
            

          創(chuàng)建的數(shù)據(jù)庫會被保存在當(dāng)前項(xiàng)目中 databases 路徑下 具體如圖所示

           

           

          添加與刪除數(shù)據(jù)庫中的表

                  數(shù)據(jù)庫是可以由多張數(shù)據(jù)表組成的 如果添加一張數(shù)據(jù)庫的表的話 可以使用 數(shù)據(jù)庫語句 create table 名稱(內(nèi)容) 來進(jìn)行添加 。這里給出一條創(chuàng)建數(shù)據(jù)庫的語句 。 意思是創(chuàng)建一張表 名稱為gameInfo 表中包含的字段 為     _id  為INTEGER 類型 并且遞增  name 為Text類型   hp mp 為INTEGER 默認(rèn)數(shù)值為100 number 為INTEGER 類型。

           
          /**創(chuàng)建一張表的SQL語句**/  
          private static final String NAME_TABLE_CREATE = "create table gameInfo("  
           + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,"+ "hp INTEGER DEFAULT 100,"+ "mp INTEGER DEFAULT 100,"  
           + "number INTEGER);"; 
          數(shù)據(jù)庫中刪除一張表 直接使用DROP TABLE  表名稱 就可以刪除
           
          /**刪除一張表的SQL語句**/  
          private static final String NAME_TABLE_DELETE = "DROP TABLE gameInfo"; 
          在代碼中去執(zhí)行一條SQL語句 使用SQLiteDatabase對象去調(diào)用execSQL() 傳入SQL語句就OK了。

           
          mDb.execSQL(NAME_TABLE_CREATE); 


          以創(chuàng)建一張名稱為gameInfo的表為例 給出代碼實(shí)現(xiàn)
           
          public class NewTable extends Activity {  
              DatabaseHelper mDbHelper = null;  
              SQLiteDatabase mDb = null;  
              Context mContext = null;  
              
              /**創(chuàng)建一張表的SQL語句**/  
              private static final String NAME_TABLE_CREATE = "create table gameInfo("  
                  + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT,"+ "hp INTEGER DEFAULT 100,"+ "mp INTEGER DEFAULT 100,"  
                  + "number INTEGER);";  
                
                
              /**刪除一張表的SQL語句**/  
              private static final String NAME_TABLE_DELETE = "DROP TABLE gameInfo";  
                
                
              @Override  
              protected void onCreate(Bundle savedInstanceState) {  
              setContentView(R.layout.create_table);  
              mContext = this;  
              mDbHelper = DatabaseHelper.getInstance(mContext);  
              mDb= mDbHelper.getReadableDatabase();    
                
              Button button0 = (Button)findViewById(R.id.createTable);  
              button0.setOnClickListener(new OnClickListener() {  
                    
                  @Override  
                  public void onClick(View arg0) {  
                  try {  
                      mDb.execSQL(NAME_TABLE_CREATE);  
                      Toast.makeText(NewTable.this, "成功添加數(shù)據(jù)表", Toast.LENGTH_LONG).show();    
                  }catch(SQLiteException e) {  
                      Toast.makeText(NewTable.this, "數(shù)據(jù)庫中已存此表", Toast.LENGTH_LONG).show();      
                  }  
                  }  
              });  
              Button button1 = (Button)findViewById(R.id.deleteTable);  
              button1.setOnClickListener(new OnClickListener() {  
                    
                  @Override  
                  public void onClick(View arg0) {  
                  try {  
                      mDb.execSQL(NAME_TABLE_DELETE);  
                      Toast.makeText(NewTable.this, "成功刪除數(shù)據(jù)表", Toast.LENGTH_LONG).show();   
                  }catch(SQLiteException e) {  
                      Toast.makeText(NewTable.this, "數(shù)據(jù)庫中已無此表", Toast.LENGTH_LONG).show();      
                  }  
            
                  }  
              });  
                
                
                
              super.onCreate(savedInstanceState);  
              }  
            

           

          增加 刪除 修改 查詢 數(shù)據(jù)庫中的數(shù)據(jù)

          使用SQLiteDatabase對象調(diào)用 insert()方法 傳入標(biāo)的名稱與ContentValues 添加的內(nèi)容 則可以向數(shù)據(jù)庫表中寫入一條數(shù)據(jù) delete ()為刪除一條數(shù)據(jù) update()為更新一條數(shù)據(jù)。


          我詳細(xì)說一下查找一條數(shù)據(jù)使用的方法 query 中 跟了8個參數(shù)

          public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit);

          參數(shù)說明:

          table:數(shù)據(jù)庫表的名稱

          columns:數(shù)據(jù)庫列名稱數(shù)組 寫入后最后返回的Cursor中只能查到這里的列的內(nèi)容


          selection:查詢條件


          selectionArgs:查詢結(jié)果

          groupBy:分組列

          having:分組條件

          orderBy:排序列

          limit:分頁查詢限制

          Cursor:返回值,將查詢到的結(jié)果都存在Cursor

          Cursor是一個游標(biāo)接口,每次查詢的結(jié)果都會保存在Cursor中 可以通過遍歷Cursor的方法拿到當(dāng)前查詢到的所有信息。

          Cursor的方法

          moveToFirst() //將Curor的游標(biāo)移動到第一條
          moveToLast()///將Curor的游標(biāo)移動到最后一條
          move(int offset)//將Curor的游標(biāo)移動到指定ID
          moveToNext()//將Curor的游標(biāo)移動到下一條
          moveToPrevious()//將Curor的游標(biāo)移動到上一條
          getCount() //得到Cursor 總記錄條數(shù)
          isFirst() //判斷當(dāng)前游標(biāo)是否為第一條記錄
          isLast()//判斷當(dāng)前游標(biāo)是否為最后一條數(shù)據(jù)
          getInt(int columnIndex)    //根據(jù)列名稱獲得列索引ID
          getString(int columnIndex)//根據(jù)索引ID 拿到表中存的字段


          這里給出一個例子遍歷Cursor的例子
           
             private void query(SQLiteDatabase db) {  
          // 把整張表的所有數(shù)據(jù)query到cursor中   
          Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);  
          //判斷cursor不為空 這個很重要   
          if (cursor != null) {  
              // 循環(huán)遍歷cursor   
              while (cursor.moveToNext()) {  
              // 拿到每一行name 與hp的數(shù)值   
              String name = cursor.getString(cursor.getColumnIndex("name"));  
              String hp = cursor.getString(cursor.getColumnIndex("hp"));  
              Log.v("info", "姓名是 " + name + "hp為 " + hp);  
              }  
              // 關(guān)閉   
              cursor.close();  
          }  
             } 


          向大家推薦一個查看數(shù)據(jù)庫的軟件非常好用, 名稱是SQLiteSpy.exe  如圖所示 打開xys.db 文件 可以清晰的看見數(shù)據(jù)庫表中儲存的內(nèi)容并且該軟件支持執(zhí)行SQL語句 可以直接在軟件中操作,我給出這款軟件的下載地址??幢疚淖詈蟮南螺d地址

           

           

           


           
          public class Newdate extends Activity {  
              DatabaseHelper mDbHelper = null;  
              SQLiteDatabase mDb = null;  
              Context mContext = null;  
            
              /** 數(shù)據(jù)庫字段 **/  
            
              public final static String TABLE_NAME = "test";  
              public final static String ID = "_id";  
              public final static String NAME = "name";  
              public final static String HP = "hp";  
              public final static String MP = "mp";  
            
              @Override  
              protected void onCreate(Bundle savedInstanceState) {  
              setContentView(R.layout.create_date);  
              mContext = this;  
              // 創(chuàng)建DatabaseHelper對象   
              mDbHelper = DatabaseHelper.getInstance(mContext);  
              // 調(diào)用getReadableDatabase方法如果數(shù)據(jù)庫不存在 則創(chuàng)建 如果存在則打開   
              mDb = mDbHelper.getReadableDatabase();  
              // 初始化 給數(shù)據(jù)庫表寫入一些信息   
              for (int i = 0; i < 10; i++) {  
                  insert(NAME, "雨松MOMO" + i);  
              }  
            
              // 增加   
              Button button0 = (Button) findViewById(R.id.add);  
              button0.setOnClickListener(new OnClickListener() {  
            
                  @Override  
                  public void onClick(View arg0) {  
                  insert(NAME, "新添加小可愛");  
                  Toast.makeText(Newdate.this, "添加一條數(shù)據(jù)名稱為小可愛", Toast.LENGTH_LONG)  
                      .show();  
                  }  
              });  
              // 刪除   
              Button button1 = (Button) findViewById(R.id.delete);  
              button1.setOnClickListener(new OnClickListener() {  
            
                  @Override  
                  public void onClick(View arg0) {  
                  delete(ID, "1");  
                  Toast.makeText(Newdate.this, "刪除一條_id=1的數(shù)據(jù)", Toast.LENGTH_LONG)  
                      .show();  
                  }  
              });  
              // 修改   
              Button button2 = (Button) findViewById(R.id.modify);  
              button2.setOnClickListener(new OnClickListener() {  
            
                  @Override  
                  public void onClick(View arg0) {  
                  update(NAME, "雨松MOMO3", "小可愛3");  
                  Toast.makeText(Newdate.this, "更新名稱雨松MOMO3 為小可愛3",  
                      Toast.LENGTH_LONG).show();  
                  }  
              });  
              // 查找   
              Button button3 = (Button) findViewById(R.id.find);  
              button3.setOnClickListener(new OnClickListener() {  
            
                  @Override  
                  public void onClick(View arg0) {  
                  Cursor cursor = find(ID, "5");  
                  String name = cursor.getString(cursor.getColumnIndex(NAME));  
                  Toast.makeText(Newdate.this, "查找ID為5數(shù)據(jù)的名稱是 " + name,  
                      Toast.LENGTH_LONG).show();  
                  }  
              });  
              super.onCreate(savedInstanceState);  
              }  
            
              /** 
               * 插入一條數(shù)據(jù) 
               *  
               * @param key 
               * @param date 
               */  
              public void insert(String key, String date) {  
              ContentValues values = new ContentValues();  
              values.put(key, date);  
              mDb.insert(TABLE_NAME, null, values);  
              }  
            
              /** 
               * 刪除一掉數(shù)據(jù) 
               *  
               * @param key 
               * @param date 
               */  
              public void delete(String key, String date) {  
              mDb.delete(TABLE_NAME, key + "=?", new String[] { date });  
              }  
            
              /** 
               * 更新一條數(shù)據(jù) 
               *  
               * @param key 
               * @param oldDate 
               * @param newDate 
               */  
              public void update(String key, String oldDate, String newDate) {  
              ContentValues values = new ContentValues();  
              values.put(key, newDate);  
              mDb.update(TABLE_NAME, values, key + "=?", new String[] { oldDate });  
              }  
            
              /** 
               * 查找一條數(shù)據(jù) 
               *  
               * @param key 
               * @param date 
               * @return 
               */  
              public Cursor find(String key, String date) {  
            
              Cursor cursor = mDb.query(TABLE_NAME, null, key + "=?",  
                  new String[] { date }, null, null, null);  
              if (cursor != null) {  
                  cursor.moveToFirst();  
              }  
              return cursor;  
              }  
            

           

          最后如果你還是覺得我寫的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來

          免費(fèi)下載地址在 http://linux.linuxidc.com/

          用戶名與密碼都是www.linuxidc.com

          具體下載目錄在 /2011年資料/Android入門教程/Android游戲開發(fā)之?dāng)?shù)據(jù)庫SQLite 詳細(xì)介紹/

          本篇文章來源于 Linux公社網(wǎng)站(www.linuxidc.com)  原文鏈接:http://www.linuxidc.com/Linux/2011-08/40540p3.htm

           

           



                                                                                                                 --    學(xué)海無涯
                  

          主站蜘蛛池模板: 江山市| 东平县| 肥城市| 海淀区| 瓮安县| 泰宁县| 葵青区| 安吉县| 张掖市| 鲁甸县| 岳普湖县| 盐源县| 蓬安县| 镇远县| 色达县| 龙里县| 贵港市| 肇庆市| 商水县| 上高县| 辉南县| 元朗区| 晋中市| 高雄市| 电白县| 宿州市| 云和县| 泾川县| 利川市| 太原市| 兰州市| 那坡县| 台北县| 龙山县| 通化市| 昌邑市| 恩平市| 扶风县| 定兴县| 义乌市| 福鼎市|