2011-08-16 5 views
0

私はFacebookブックの統合を含むアプリケーションを作っています。 アクセストークンを保存して、アプリケーションを表示するために再度ログインする必要がないようにする必要があります。しかし、私はアクセストークンを格納することができません。 以下iはandroid sqlLite3データベースのCant store facebookアクセストークン

08-16 13:57:53.236: ERROR/Database(7964): Error inserting acces_token=177852938929775|8e4aec98e182f7034b497766.3-618306968|YAriJqaRTDz1aIgNHjom_tdBnnw 
08-16 13:57:53.236: ERROR/Database(7964): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 
08-16 13:57:53.236: ERROR/Database(7964):  at android.database.sqlite.SQLiteStatement.native_execute(Native Method) 
08-16 13:57:53.236: ERROR/Database(7964):  at android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:55) 
08-16 13:57:53.236: ERROR/Database(7964):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1623) 
08-16 13:57:53.236: ERROR/Database(7964):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1484) 
08-16 13:57:53.236: ERROR/Database(7964):  at org.db.dbHelper.insertRows(dbHelper.java:63) 
08-16 13:57:53.236: ERROR/Database(7964):  at org.neighbourhood.neighbourhood.onFacebookConnectorWorking(neighbourhood.java:142) 

コード取得エラーである: - データベース内の値をはめ込むため

dbHelper db = new dbHelper(neighbourhood.this); 
     db.open(); 
     ContentValues cv = new ContentValues(); 
     cv.put("acces_token", 
        facebookConnector.getFacebook().getAccessToken()); 
     db.insertRows(cv, "facebook"); 
     db.close(); 

コード: -

パブリッククラスdbHelper {

private final String DATABASE_NAME = "neighbourhood.db"; 
private final String TAG = "dbHelper"; 

private static final String DATABASE_CREATE_TABLE_LOGIN = "create table login" + 
     " (is_login text not null);"; 

private static final String DATABASE_CREATE_TABLE_FACEBOOK = "create table " 
     + "facebook" 
     + " (name text not null," 
     + "first_name text not null," + 
     "last_name text not null," + 
     "gender text not null," + 
     "email text not null," + 
     "id text not null," + 
     "birthday text not null," + 
     "acces_token text not null);"; 


private SQLiteDatabase myDatabase; 
private myDbhelper helper; 

public dbHelper(Context context) { 
    helper = new myDbhelper(context, DATABASE_NAME, null, 1); 
} 

/** 
* This method is used to open the database in Writable mode 
* 
* @return instance of the database 
*/ 
public dbHelper open() { 
    try { 
     myDatabase = helper.getWritableDatabase(); 
    } catch (SQLException ex) { 
     ex.printStackTrace(); 
     } 
    return this; 
} 

/** 
* This method is used for closing the database 
*/ 
public void close() { 
    myDatabase.close(); 
} 


public long insertRows(ContentValues values, String tableName) { 
    long val = myDatabase.insert(tableName, null, values); 
    return val; 
} 

public Cursor getAllValues(String tableName) { 
    Cursor myResult; 
    myResult = myDatabase.query(tableName, null, null, null, null, null, 
      null, null); 

    return myResult; 
} 


private static class myDbhelper extends SQLiteOpenHelper { 
    public myDbhelper(Context context, String name, CursorFactory factory, 
      int version) { 
     super(context, name, factory, version); 
    } 

    /** 
    * this method is called when the database is created first time 
    */ 
    @Override 
    public void onCreate(SQLiteDatabase _db) { 
     _db.execSQL(DATABASE_CREATE_TABLE_LOGIN); 
     _db.execSQL(DATABASE_CREATE_TABLE_FACEBOOK); 

    } 

    /** 
    * this method is called when the database version is changed 
    */ 
    @Override 
    public void onUpgrade(SQLiteDatabase _db, int _oldVersion, 
      int _newVersion) { 
     /* 
     * _db.execSQL("DROP TABLE IF EXISTS all_audio"); 
     * _db.execSQL("DROP TABLE IF EXISTS all_video"); 
     * _db.execSQL("DROP TABLE IF EXISTS all_playlist"); 
     */ 
     _db.execSQL("DROP TABLE IF EXISTS all_playlist_song"); 
     onCreate(_db); 

    } 
} 

を}

+0

データベースの外観は? dbHelper.javaの63行目は何ですか? –

+0

あなたのlogcatエラーは制約違反を示しています - データベーステーブルの作成に使用したコードを質問に追加できますか? – Pikaling

答えて

0

あなたのスキーマは、あなたのfacebookテーブルのすべてのフィールドがNOT NULLであることを指定しますが、あなただけのNULLように残りのフィールドを強制しますacces_tokenフィールドを挿入しています。

private static final String DATABASE_CREATE_TABLE_FACEBOOK = "create table " 
    + "facebook" 
    + " (name text not null," 
    + "first_name text not null," + 
    "last_name text not null," + 
    "gender text not null," + 
    "email text not null," + 
    "id text not null," + 
    "birthday text not null," + 
    "acces_token text not null);"; 

例外がandroid.database.sqlite.SQLiteConstraintException: error code 19: constraint failedを言う理由はここにある - あなたのNOT NULL制約が侵害されています。

acces_tokenを別のテーブル(仮想の「admin」テーブルなど)に分割するか、他のフィールドで制約を緩和するか、acces_tokenの代わりにデータ行全体を挿入する必要があります。

+0

Alrighty :) – abhishek

1

メソッドinsertRowsは、ContentValuesとしてパラメータを持つ必要があります。 その方法では、contentvalues.putallメソッドを呼び出してデータベースに値を挿入する必要があります。私たちはあなたのテーブルのスキームを見るまで、私たちはエラーが発生することがありますかについての情報を提供することはできません

public long insertRows(ContentValues values, String tableName) 
    { 
     ContentValues in=new ContentValues(); 
     in.putAll(values); 


     return myDatabase.insert(tableName, null, in); 
    } 
+0

これは私の行の挿入メソッドです - > public long insertRows(ContentValues values、String tableName){ \t \t long val = myDatabase.insert(tableName、null、values); \t \t return val; \t} – abhishek

+0

shudnt in.putAll(values)??私の同じコードではないのですか? – abhishek

+0

今すぐ試すことができます –

0

: これを試してみてください。おそらくあなたが制限acces_tokenの長さは、テーブルを作成するとき?

0

私の経験から、アクセストークンを保存する必要はありません。いくつかの良い理由があります。

(1)FacebookのAPIは、正確に何をしたい

を行う新葛・サインオン機能を持っている(2)アクセストークンを変更することができ、これは毎日起こるか、すべてはありません週に1回は実行されますが、失敗した場合はデータベースを更新する必要があります。

(3)APIはAndroidの公式Facebook Appで動作します。そのため、ユーザーはFacebook Appに自分の携帯電話でログインしていれば、自分のAppに登録する必要はありません。

(4)ユーザーが携帯電話に公式Facebookアプリケーションをインストールしていない場合は、ブラウザのCookieを使用できます。これはFacebook API経由で自動的に行われます。

関連する問題