⑴ 開發安卓app版本升級的資料庫應該怎麼設計啊。。
資料庫升級可以以app的版本號作為參照,程序升級了,資料庫做升級處理。 資料庫升級是先把原來資料庫拷貝到另一個目錄備份,在原來的DB裡面把所有表先創建一個備份表出來 tb_舊表名,把新增的表和新增的欄位在添進去,然後把舊表的數據遍歷 insert到 臨時表裡,完成後把舊表刪除掉,再把tb_舊表名的 改名,把tb_去掉,成功後,將備份的資料庫刪除調。如果有失敗,把這個DB刪除掉,把備份的DB拷貝回來。
⑵ android中的資料庫怎麼去寫如何建表,希望有具體代碼參考啊!
android 中的資料庫操作 android 中的應用開發很難避免不去使用資料庫, 聊聊 android 中的數據 庫操作,我發給你 word 貼不下
一、android 內的資料庫的基礎知識介紹
1.用了什麼資料庫
android 中採用的資料庫是 sqlite 這個輕量級的嵌入式開源資料庫,它是用 c 語言構建的。相關簡介可以從鏈接查看。
2.資料庫基本知識觀花
對於一些和我一樣還沒有真正系統學習資料庫技術的同學來說,把 SQL92 標 准中的一些基本概念、基本語句快速的了解一下,是很有必要的,這樣待會用 Android 的 database 相關方法去執行一些資料庫語句時就不會茫然了。
①資料庫的基本結構——表格
表格是資料庫中儲存資料的基本架構。表格被分為欄位 (column) 及列位 (row)。每 一列代表一筆資料,而每一欄代表一筆資料的一部份。舉例來說,如果我們有一個記載顧客 資料的表格,那欄位就有可能包括姓、名、地址、城市、國家、生日..等等。每一個表格 . 擁有一個獨一無二的名字(Table Name)以便能夠讓用戶定位到它上面。一個典型的表格結 構如下:
Store_Information 表格
store_name Sales Date Los Angeles $1500 Jan-05-1999 San Diego $250 Jan-07-1999 Los Angeles $300 Jan-08-1999 Boston $700 Jan-08-1999 該表格的表格名字為 Store_Information, 一共有三個欄位, 分別為 store_name , Sales , Data , 已經錄入了四筆數據所以有四個列位。
②關於數據類型
和其他的資料庫不同的是,sqlite 是無類型的。也就是當你創建一個表格時,無需對 每一個欄位要存儲的數據的類型進行聲明,當你在給表格增加數據條目時,sqlite 會自動找 到存入的數據的類型。
SQLite 允許忽略數據類型,但是,仍然建議在 Create Table 語句中指定數據類型, 因為數據類型有利於增強程序的可讀性。SQLite 支持常見的數據類型,如 VARCHAR、 NVARCHAR、TEXT、INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、 NUMERIC、VARYING、CHARACTER、NATl0NAI, VARYINGCHARACTER。這些數據類 型都是 SQL92 標准中規定的標准資料庫數據類型,想要有更近一步了解,請參看下錶。
SQL 資料庫數據類型詳解 數據類型 類型 描 述 bit 整型 bit 數據類型是整型,其值只能是 0、1 或空值。這種數據類型用於存儲只有兩 種可能值的數據,如 Yes 或 No、True 或 Fa lse 、On 或 Off int 整型 int 數據類型可以存儲從- 231(-2147483648)到 231 (2147483 647)之間的整數。存 儲到資料庫的幾乎所有數值型的數據都可以用這種數據類型。 這種數據類型在資料庫里佔用 4 個位元組 smallint 整型 smallint 數據類型可以存儲從- 215(-32768)到 215(32767)之間的整數。這種 數據類型對存儲一些常限定在特定范圍內的數值型數據非常有用。 這種數據類型在資料庫里 佔用 2 位元組空間 tinyint 整型 tinyint 數據類型能存儲從 0 到 255 之間的整數。 它在你只打算存儲有限數目 的數值時很有用。 這種數據類型在資料庫中佔用 1 個位元組 numeric 精確數值型 numeric 數據類型與 decimal 型相同 decimal 精確數值型 decimal 數據類型能用來存儲從-1038-1 到 1038-1 的固定精度和范圍 的數值型數據。使用這種數據類型時,必須指定范圍和精度。 范圍是小數點左右所能存儲
⑶ android 平台資料庫表與uri對應關系看不明白,請高人指點
android的聯系人資料庫是一個三層架構,raw_contacts表,contacts表,data表合起來,才能完整的表示一個聯系人的所有信息。那為什麼不直接設計一張contacts表示所有聯系人呢?理由是,聯系人的數據是易變的,而且數據種類繁多。打個比方,你可以隨意的把兩個聯系人合並在一起,也可以隨意的為一個聯系人增加新的信息(如家庭地址,郵件地址,昵稱,頭像等等),把所有信息合並放在一張表裡明顯是不可能的。資料庫設計時考慮的可擴展,可維護。
由於android底層的資料庫很復雜,開發者想得到一個聯系人的信息時,經常需要訪問3-4張的表才能獲取到完整數據,這個過程是很復雜很繁瑣的。好在開發時你不用關注這些,因為android幫你把這些已經封裝好了,你能看到也就是ContactsContract這個類裡面抽象好了的映射。事實上,ContactsContract這個類是根據功能進行抽象的,和底層實現完全沒有任何關系。他們之間通過某個ContentProvider連系起來,當你請求content://com.android.contacts/contacts這個欄位時,會調用ContentProvider,ContentProvider根據你的uri生成查詢不同的表的sql語句,然後把查詢結果返回給你。
結果表現就是,你在ContactsContract這個類看到某些欄位在對應的表裡找不到,因為這個欄位被放到其他的表裡面去了。
⑷ android資料庫存儲,代碼創建資料庫、表,實現編輯框內輸入,點擊按鈕提交進行存入;從資料庫中提
常量類:ConstantUtil
publicclassConstantUtil{
//資料庫名稱
_NAME="user_manager.db";
//資料庫版本號
publicstaticfinalintDATABASE_VERSION=1;
//表名
publicstaticfinalStringTABLE_NAME="user_info";
//欄位名
publicstaticfinalStringUSER_ID="userId";
publicstaticfinalStringUSER_NAME="username";
publicstaticfinalStringUSER_PASSWORD="password";
publicstaticfinalStringUSER_ADDRESS="address";
}
自定義SQLiteOpenHelper:MySQLiteOpenHelper
{
//定義一個SQLiteDatabase對象,對表進行相應的操作
;
publicMySQLiteOpenHelper(Contextcontext){
super(context,ConstantUtil.DATABASE_NAME,null,
ConstantUtil.DATABASE_VERSION);
mDatabase=getWritableDatabase();
}
/*
*創建表
*/
@Override
publicvoidonCreate(SQLiteDatabasedb){
//TODOAuto-generatedmethodstub
//sql語句
Stringsql="createtable"+ConstantUtil.TABLE_NAME+"("
+ConstantUtil.USER_ID+"integerprimarykey,"
+ConstantUtil.USER_NAME+"textnotnull,"
+ConstantUtil.USER_PASSWORD+"textnotnull,"
+ConstantUtil.USER_ADDRESS+"textnotnull)";
db.execSQL(sql);
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
//TODOAuto-generatedmethodstub
onCreate(db);
}
/**
*添加數據
*@paramcv
*@return
*/
publicbooleaninsertData(ContentValuescv){
returnmDatabase.insert(ConstantUtil.TABLE_NAME,null,cv)>0;
}
/**
*查詢所有數據
*@return
*/
publicList<Userinfo>queryData(){
List<Userinfo>userinfos=newArrayList<Userinfo>();
//從資料庫里查詢數據
Cursorcursor=mDatabase.query(ConstantUtil.TABLE_NAME,null,null,null,null,null,null);
if(cursor!=null){
//取出數據
while(cursor.moveToNext()){
Userinfouserinfo=newUserinfo();
userinfo.setUserId(cursor.getInt(0));
userinfo.setUsername(cursor.getString(1));
userinfo.setPassword(cursor.getString(2));
userinfo.setAddress(cursor.getString(3));
userinfos.add(userinfo);
}
}
returnuserinfos;
}
}
主Activity
{
//控制項
privateTextViewtxtName,txtPwd,txtAddress;
privateEditTextedtName,edtPwd,edtAddress;
privateListViewmListView;
//資料庫對象
;
privateUserinfoAdapteradapter;
/**.*/
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findView();
init();
}
privatevoidfindView(){
//TODOAuto-generatedmethodstub
edtName=(EditText)findViewById(R.id.id_edit1);
edtPwd=(EditText)findViewById(R.id.id_edit2);
edtAddress=(EditText)findViewById(R.id.id_edit3);
mListView=(ListView)findViewById(R.id.id_listview);
}
privatevoidinit(){
//TODOAuto-generatedmethodstub
mySQLiteOpenHelper=newMySQLiteOpenHelper(MainActivity.this);
}
publicvoidonAction(Viewv){
switch(v.getId()){
caseR.id.id_btn_add:
//添加數據
StringuserName=edtName.getText().toString();
StringuserPwd=edtPwd.getText().toString();
StringuserAdress=edtAddress.getText().toString();
//傳入參數
ContentValuescv=newContentValues();
//列名和值
cv.put(ConstantUtil.USER_NAME,userName);
cv.put(ConstantUtil.USER_PASSWORD,userPwd);
cv.put(ConstantUtil.USER_ADDRESS,userAdress);
//得到結果
booleanflag=mySQLiteOpenHelper.insertData(cv);
if(flag){
Toast.makeText(MainActivity.this,"添加記錄成功",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this,"添加記錄失敗",Toast.LENGTH_SHORT).show();
}
break;
caseR.id.id_btn_query:
//查詢數據
List<Userinfo>userinfos=mySQLiteOpenHelper.queryData();
if(adapter!=null){
adapter=null;
}
adapter=newUserinfoAdapter(userinfos);
mListView.setAdapter(adapter);
break;
default:
break;
}
}
//數據適配器
{
List<Userinfo>userinfos;
publicUserinfoAdapter(List<Userinfo>_userinfos){
this.userinfos=_userinfos;
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnuserinfos.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnuserinfos.get(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
if(convertView==null){
convertView=LayoutInflater.from(MainActivity.this).inflate(R.layout.listview_item,null);
txtName=(TextView)convertView.findViewById(R.id.id_txt_name);
txtPwd=(TextView)convertView.findViewById(R.id.id_txt_pwd);
txtAddress=(TextView)convertView.findViewById(R.id.id_txt_address);
txtName.setText(userinfos.get(position).getUsername());
txtPwd.setText(userinfos.get(position).getPassword());
txtAddress.setText(userinfos.get(position).getAddress());
}
returnconvertView;
}
}
}
完整源碼下載地址(附資料庫文件查詢軟體+運行效果圖):
⑸ Android資料庫操作表的兩種方法,通過sql 語句法和谷歌提供的api 方法進行比較情況如何
DirverManager類:是JDBC的管理層,作用於用戶和驅動之間。該類負責注冊和載入JDBC驅動。
Connection介面:代表與資料庫的鏈接,並擁有創建SQL語句的方法,以完成基本的SQL操作,同時為資料庫事務提供提交和回滾方法。如:上面的例子就是鏈接到了TestData資料庫。
Statement介面:用於執行不帶參數的簡單SQL語句。創建Statement實例對象後可以調用JDBC提供的3種執行SQL語句的方法:
(1)executeUpdate()方法,一般用於執行SQL的INSERT,DELETE,UPDATE語句
(2)executeQuery()方法,一般用於執行SQL的SELECT語句,因為 它的返回值是執行SQL語句後產生的一個ResultSet介面的實例(結果集)
(3)execute()方法,即一般它執行的SQL語句既有查詢又有更新值,約等於executeUpdate()和executeQuery()兩個方法的合輯。
PreparedStatement介面:它與Statement 的主要區別
(1)它包含的SQL語句是預編譯的,所以當多次執行一條SQL語句時用它會更快
(2)在設置參數是可以用「?」代替。如:
PreparedStatement pstmt=conn.preparedStatement(insert into test values(?,?));
pstmt.setString(1,'gg');
pstmt.setString(2,'123');
ResultSet介面:包含了Statement和PreparedStatement的executeQuery方法中SELECT的結果集。相當於用它來讀取資料庫里每列的值。
DatabaseMetaData介面:主要是用來得到資料庫的相關信息的。如:資料庫版本啊
ResultSetMetaData介面:主要是用來獲取資料庫中表的相關信息的。如:表的行數啊。,謝謝