通过上一篇文章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数据表的创建、更新等,代码如下
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类文件实现用户记录的创建、更新、删除等,代码如下:
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方法添加代码:
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){ ...... } } }