zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android学习笔记-保存数据到SQL数据库中(SavingDatainSQLDatabases)

2023-06-13 09:15:29 时间

知识点:

1.使用SQLHelper创建数据库
2.数据的增删查改(PRDU:Put、Read、Delete、Update)

背景知识:

下面将用一个关于联系人的数据库Demo来具体学习。

具体知识:

1.定义Contract类

在创建SQL数据库之前,要创建Contract类。那什么是Contract类呢?

复制代码代码如下:


ContractClass的定义:
   ContractClass,又可以叫做CompanionClass。
   AndroidDeveloper的帮助文档是这么说的:
  <AcontractclassisacontainerforconstantsthatdefinenamesforURIs,
    tables,andcolumns.Thecontractclassallowsyoutousethesameconstants
    acrossalltheotherclassesinthesamepackage.Thisletsyouchangea
    columnnameinoneplaceandhaveitpropagatethroughoutyourcode.>
    Contact类是定义URI、表、列的名字的容器。这个类允许我们在同一包的不同类下使用相同的常量。
    我们在一处修改了列名,同时传播到我们代码的每个地方。

复制代码代码如下:


packagecom.example.sqlitetest;
//Contract类
publicclassContact{
   
   int_id;
   String_name;
   String_phone_number;
   
   publicContact(){
       
   }
   publicContact(intid,Stringname,String_phone_number){
       this._id=id;
       this._name=name;
       this._phone_number=_phone_number;
   }
   
   publicContact(Stringname,String_phone_number){
       this._name=name;
       this._phone_number=_phone_number;
   }
   publicintgetID(){
       returnthis._id;
   }
   
   publicvoidsetID(intid){
       this._id=id;
   }
   
   publicStringgetName(){
       returnthis._name;
   }
   
   publicvoidsetName(Stringname){
       this._name=name;
   }
   
   publicStringgetPhoneNumber(){
       returnthis._phone_number;
   }

   publicvoidsetPhoneNumber(Stringphone_number){
       this._phone_number=phone_number;
   }
}

2.使用SQLHelper创建数据库

         就像保存文件在内部存储一样,Android在私有的应用存储空间存储我们的数据库,这样就保证我们的数据是安全的。不能被其他应用访问到。

在设备上存储的数据库保存在:
            /data/data/<package_name>/databases目录下

为了使用SQLiteOpenHelper,我们需要创建一个重写了onCreate(),onUpgrade()和onOpen()回调方法的子类。

3.数据的增删改查

增:传ContentValue值到insert()方法。

复制代码代码如下:
SQLiteDatabasedb=this.getWritableDatabase();
 
ContentValuesvalues=newContentValues();
values.put(KEY_NAME,contact.getName());
values.put(KEY_PH_NO,contact.getPhoneNumber());
 
db.insert(TABLE_CONTACTS,null,values);
db.close();

删:delete()方法

复制代码代码如下:
SQLiteDatabasedb=this.getWritableDatabase();
db.delete(TABLE_CONTACTS,KEY_ID+"=?",
       newString[]{String.valueOf(contact.getID())});
db.close();

 改:update()方法

 

复制代码代码如下:
 SQLiteDatabasedb=this.getWritableDatabase();

ContentValuesvalues=newContentValues();
values.put(KEY_NAME,contact.getName());
values.put(KEY_PH_NO,contact.getPhoneNumber());


returndb.update(TABLE_CONTACTS,values,KEY_ID+"=?",
         ewString[]{String.valueOf(contact.getID())});
 

查:query()方法

复制代码代码如下:
SQLiteDatabasedb=this.getReadableDatabase();

Cursorcursor=db.query(TABLE_CONTACTS,newString[]{KEY_ID,
               KEY_NAME,KEY_PH_NO},KEY_ID+"=?",
               newString[]{String.valueOf(id)},null,null,null,null);
if(cursor!=null)
cursor.moveToFirst();

Contactcontact=newContact(Integer.parseInt(cursor.getString(0)),
               cursor.getString(1),cursor.getString(2));

returncontact;

完整DatabaseHelper代码如下:

复制代码代码如下:
packagecom.example.sqlitetest;

importjava.util.ArrayList;
importjava.util.List;

importandroid.content.ContentValues;
importandroid.content.Context;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;

publicclassDatabaseHelperextendsSQLiteOpenHelper{

   //数据库版本
   privatestaticfinalintDATABASE_VERSION=1;

   //数据库名
   privatestaticfinalStringDATABASE_NAME="contactsManager";

   //Contact表名
   privatestaticfinalStringTABLE_CONTACTS="contacts";

   //Contact表的列名
   privatestaticfinalStringKEY_ID="id";
   privatestaticfinalStringKEY_NAME="name";
   privatestaticfinalStringKEY_PH_NO="phone_number";

   publicDatabaseHelper(Contextcontext){
       super(context,DATABASE_NAME,null,DATABASE_VERSION);
   }

   //创建表
   @Override
   publicvoidonCreate(SQLiteDatabasedb){
       StringCREATE_CONTACTS_TABLE="CREATETABLE"+TABLE_CONTACTS+"("
               +KEY_ID+"INTEGERPRIMARYKEY,"+KEY_NAME+"TEXT,"
               +KEY_PH_NO+"TEXT"+")";
       db.execSQL(CREATE_CONTACTS_TABLE);
   }

   //更新表
   @Override
   publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
       //删除旧表
       db.execSQL("DROPTABLEIFEXISTS"+TABLE_CONTACTS);

       //再次创建表
       onCreate(db);
   }

   /**
    *增删改查操作
    */

   //增加新的联系人
   voidaddContact(Contactcontact){
       SQLiteDatabasedb=this.getWritableDatabase();

       ContentValuesvalues=newContentValues();
       values.put(KEY_NAME,contact.getName());
       values.put(KEY_PH_NO,contact.getPhoneNumber());

       //插入行
       db.insert(TABLE_CONTACTS,null,values);
       db.close();//关闭数据库的连接
   }

   //获取联系人
   ContactgetContact(intid){
       SQLiteDatabasedb=this.getReadableDatabase();

       Cursorcursor=db.query(TABLE_CONTACTS,newString[]{KEY_ID,
               KEY_NAME,KEY_PH_NO},KEY_ID+"=?",
               newString[]{String.valueOf(id)},null,null,null,null);
       if(cursor!=null)
           cursor.moveToFirst();

       Contactcontact=newContact(Integer.parseInt(cursor.getString(0)),
               cursor.getString(1),cursor.getString(2));
       returncontact;
   }
   
   //获取所有联系人
   publicList<Contact>getAllContacts(){
       List<Contact>contactList=newArrayList<Contact>();
       //SelectAllQuery
       StringselectQuery="SELECT *FROM"+TABLE_CONTACTS;

       SQLiteDatabasedb=this.getWritableDatabase();
       Cursorcursor=db.rawQuery(selectQuery,null);

       if(cursor.moveToFirst()){
           do{
               Contactcontact=newContact();
               contact.setID(Integer.parseInt(cursor.getString(0)));
               contact.setName(cursor.getString(1));
               contact.setPhoneNumber(cursor.getString(2));
               contactList.add(contact);
           }while(cursor.moveToNext());
       }

       returncontactList;
   }

   //更新单个联系人
   publicintupdateContact(Contactcontact){
       SQLiteDatabasedb=this.getWritableDatabase();

       ContentValuesvalues=newContentValues();
       values.put(KEY_NAME,contact.getName());
       values.put(KEY_PH_NO,contact.getPhoneNumber());

       //更新行
       returndb.update(TABLE_CONTACTS,values,KEY_ID+"=?",
               newString[]{String.valueOf(contact.getID())});
   }

   //删除单个联系人
   publicvoiddeleteContact(Contactcontact){
       SQLiteDatabasedb=this.getWritableDatabase();
       db.delete(TABLE_CONTACTS,KEY_ID+"=?",
               newString[]{String.valueOf(contact.getID())});
       db.close();
   }


   //获取联系人数量
   publicintgetContactsCount(){
       StringcountQuery="SELECT *FROM"+TABLE_CONTACTS;
       SQLiteDatabasedb=this.getReadableDatabase();
       Cursorcursor=db.rawQuery(countQuery,null);
       cursor.close();

       returncursor.getCount();
   }
}

还有一些代码不是本次学习的重点,就不贴出来了。有需要的留言找我要。

 Demo运行效果图: