android开发我的新浪微博客户端-载入页面sqlite篇(1.2)

     

      通过上一篇文章(android开发我的新浪微博客户端-载入页面UI篇(1.1))已经完成了载入页面的UI部分的实现,效果如上图,接下来在上面的基础上完成载入页面的功能代码。

      首先说明一下新浪微博提供了OAuth和Base OAuth两种认证方式(如果不知道什么是OAuth和Base OAuth请自己google一下恶补,同时接下来的2篇随笔也会对这方面进行详细的说明以及具体实现),本项目是采用OAuth认证方式,采用这种方式就需要有用户的新浪UserID、Access Token、Access Secret这3样东西才能自由便利的调用新浪的开放接口,本项目是这样做的当用户第一次使用软件时进行授权认证获取这3样东西的时候存储到sqlite库中以便用户下次使用时不需要重新进行繁琐的授权认证操作直接从sqlite库中读取出来即可,由于这样的需求载入页面的功能设定是这样:当用户打开软件显示载入页面时开始检查sqlite库中是否已经保存有用户的新浪微博的UserID号、Access Token、Access Secret的记录,如果一条记录都没有那就说明用户是第一次使用本软件那么跳到认证授权页面进行授权认证操作(认证授权功能在接下来的两篇中进行实现讲解)获取这3个值保存到sqlite库中,如果已经包括了记录,那么读取这些记录的UserID号、Access Token、Access Secret值然后根据这3个值调用新浪的api接口获取这些记录对应的用户昵称和用户头像图标等信息。

      上面功能设定中涉及到sqlite数据库的创建、数据表的创建、数据记录的添加、数据记录的读取等操作,这里新建名为SqliteHelper.java类文件提供sqlite数据表的创建、更新等,代码如下:

 ExpandedBlockStart.gif代码

public   class  SqliteHelper  extends  SQLiteOpenHelper{
    //用来保存
UserID、Access Token、Access Secret
的表名
     public   static   final  String TB_NAME = " users " ;
    
public  SqliteHelper(Context context, String name, CursorFactory factory,  int  version) {
        
super (context, name, factory, version);
    }
    //创建表
    @Override
    
public   void  onCreate(SQLiteDatabase db) {
        db.execSQL(
" CREATE TABLE IF NOT EXISTS  " +
                TB_NAME
+ " ( " +
                UserInfo.ID
+ "  integer primary key, " +
                UserInfo.USERID
+ "  varchar, " +
                UserInfo.TOKEN
+ "  varchar, " +
                UserInfo.TOKENSECRET
+ "  varchar, " +
                UserInfo.USERNAME
+ "  varchar, " +
                UserInfo.USERICON
+ "  blob " +
                
" ) "
                );
        Log.e(
" Database " , " onCreate " );
    }
    //更新表
    @Override
    
public   void  onUpgrade(SQLiteDatabase db,  int  oldVersion,  int  newVersion) {
        db.execSQL(
" DROP TABLE IF EXISTS  "   +  TB_NAME);
        onCreate(db);
        Log.e(
" Database " , " onUpgrade " );
    }
    //更新列
    
public   void  updateColumn(SQLiteDatabase db, String oldColumn, String newColumn, String typeColumn){
        
try {
            db.execSQL(
" ALTER TABLE  "   +
                    TB_NAME 
+   "  CHANGE  "   +
                    oldColumn 
+   "   " +  newColumn  +
                    
"   "   +  typeColumn
            );
        }
catch (Exception e){
            e.printStackTrace();
        }
    }
}

 接下来新建名为DataHelper.java类文件实现用户记录的创建、更新、删除等,代码如下:

ExpandedBlockStart.gif 代码
public   class  DataHelper {
    
// 数据库名称
     private   static  String DB_NAME  =   " mysinaweibo.db " ;
    
// 数据库版本
     private   static   int  DB_VERSION  =   2 ;
    
private  SQLiteDatabase db;
    
private  SqliteHelper dbHelper;
    
    
public  DataHelper(Context context){
        dbHelper
= new  SqliteHelper(context,DB_NAME,  null , DB_VERSION);
        db
=  dbHelper.getWritableDatabase();
    }
    
    
public   void  Close()
    {
        db.close();
        dbHelper.close();
    }
    
// 获取users表中的UserID、Access Token、Access Secret的记录
     public  List < UserInfo >  GetUserList(Boolean isSimple)
    {
        List
< UserInfo >  userList  =   new  ArrayList < UserInfo > ();
        Cursor cursor
= db.query(SqliteHelper.TB_NAME,  null null null null null , UserInfo.ID + "  DESC " );
        cursor.moveToFirst();
        
while ( ! cursor.isAfterLast() &&  (cursor.getString( 1 ) != null )){
            UserInfo user
= new  UserInfo();
            user.setId(cursor.getString(
0 ));
            user.setUserId(cursor.getString(
1 ));
            user.setToken(cursor.getString(
2 ));
            user.setTokenSecret(cursor.getString(
3 ));
            
if ( ! isSimple){
            user.setUserName(cursor.getString(
4 ));
            ByteArrayInputStream stream 
=   new  ByteArrayInputStream(cursor.getBlob( 5 )); 
            Drawable icon
=  Drawable.createFromStream(stream,  " image " );
            user.setUserIcon(icon);
            }
            userList.add(user);
            cursor.moveToNext();
        }
        cursor.close();
        
return  userList;
    }
    
    
// 判断users表中的是否包含某个UserID的记录
     public  Boolean HaveUserInfo(String UserId)
    {
        Boolean b
= false ;
        Cursor cursor
= db.query(SqliteHelper.TB_NAME,  null , UserInfo.USERID  +   " = "   +  UserId,  null null null , null );
        b
= cursor.moveToFirst();
        Log.e(
" HaveUserInfo " ,b.toString());
        cursor.close();
        
return  b;
    }
    
    
// 更新users表的记录,根据UserId更新用户昵称和用户图标
     public   int  UpdateUserInfo(String userName,Bitmap userIcon,String UserId)
    {
        ContentValues values 
=   new  ContentValues();
        values.put(UserInfo.USERNAME, userName);
        
//  BLOB类型  
         final  ByteArrayOutputStream os  =   new  ByteArrayOutputStream();  
        
//  将Bitmap压缩成PNG编码,质量为100%存储          
        userIcon.compress(Bitmap.CompressFormat.PNG,  100 , os);   
        
//  构造SQLite的Content对象,这里也可以使用raw  
        values.put(UserInfo.USERICON, os.toByteArray());
        
int  id =  db.update(SqliteHelper.TB_NAME, values, UserInfo.USERID  +   " = "   +  UserId,  null );
        Log.e(
" UpdateUserInfo2 " ,id + "" );
        
return  id;
    }
    
    
// 更新users表的记录
     public   int  UpdateUserInfo(UserInfo user)
    {
        ContentValues values 
=   new  ContentValues();
        values.put(UserInfo.USERID, user.getUserId());
        values.put(UserInfo.TOKEN, user.getToken());
        values.put(UserInfo.TOKENSECRET, user.getTokenSecret());
        
int  id =  db.update(SqliteHelper.TB_NAME, values, UserInfo.USERID  +   " = "   +  user.getUserId(),  null );
        Log.e(
" UpdateUserInfo " ,id + "" );
        
return  id;
    }
    
    
// 添加users表的记录
     public  Long SaveUserInfo(UserInfo user)
    {
        ContentValues values 
=   new  ContentValues();
        values.put(UserInfo.USERID, user.getUserId());
        values.put(UserInfo.TOKEN, user.getToken());
        values.put(UserInfo.TOKENSECRET, user.getTokenSecret());
        Long uid 
=  db.insert(SqliteHelper.TB_NAME, UserInfo.ID, values);
        Log.e(
" SaveUserInfo " ,uid + "" );
        
return  uid;
    }
    
    
// 删除users表的记录
     public   int  DelUserInfo(String UserId){
        
int  id =   db.delete(SqliteHelper.TB_NAME, UserInfo.USERID  + " = " + UserId,  null );
        Log.e(
" DelUserInfo " ,id + "" );
        
return  id;
    }
}


      完成上面的代码后,我们需要在载入页面中调用上面的方法实现sqlite库中是否已经保存有用户的新浪微博的UserID号、Access Token、Access Secret的记录的功能在MainActivity的onCreate方法添加代码:

 ExpandedBlockStart.gif代码

  public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        setContentView(R.layout.main);

        ......

        
// 获取账号列表
        dbHelper = new  DataHelper( this );
        List
< UserInfo >  userList =  dbHelper.GetUserList( true );
        
if (userList.isEmpty()) // 如果为空说明第一次使用跳到AuthorizeActivity页面进行OAuth认证
        {
               Intent intent 
=   new  Intent();
               intent.setClass(MainActivity.
this , AuthorizeActivity. class );
               startActivity(intent);
        }
        
else // 如果不为空读取这些记录的UserID号、Access Token、Access Secret值
            
// 然后根据这3个值调用新浪的api接口获取这些记录对应的用户昵称和用户头像图标等信息。
        {
               
for (UserInfo user:userList){
                  ......
               }
        }
}

       关于载入页面的sqlite就说到这里了,下一篇说说OAuth认证实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值