Не могу хранить токен доступа Facebook в базе данных Android sqlLite3 - PullRequest
0 голосов
/ 16 августа 2011

Я делаю приложение, которое включает интеграцию с 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);

    }
}

}

Ответы [ 4 ]

1 голос
/ 16 августа 2011

Метод 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 голосов
/ 16 августа 2011

В вашей схеме указано, что все поля вашей таблицы facebook должны быть NOT NULL, но вы вставляете только поле acces_token, в результате чего оставшиеся поля будут 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);";

Вот почему исключение говорит android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed - ваши ограничения NOT NULL нарушаются.

Вам нужно либо разделить acces_token в отдельную таблицу (например, гипотетическую таблицу "admin")ослабьте свои ограничения в других полях или вставьте всю строку данных вместо acces_token.

0 голосов
/ 16 августа 2011

По моему опыту, нет необходимости хранить токен доступа.Есть несколько веских причин:

(1) Facebook API имеет функцию единого входа, которая делает именно то, что вы хотите

(2) Токен доступа может измениться, этого не происходиткаждый день или каждую неделю, но это происходит, и когда это произойдет, вам нужно будет обновить базу данных после неудачного входа в систему.

(3) API работает с официальным приложением Facebook для Android, так что если пользовательвошли в приложение Facebook на своем телефоне, в вашем приложении им это не понадобится.

(4) Если пользователь не установил официальное приложение Facebook на своем телефоне, файл cookie из браузера может бытьиспользуется, и это автоматически выполняется через API Facebook.

0 голосов
/ 16 августа 2011

Пока мы не увидим схему вашей таблицы, мы не можем предоставить информацию о том, что может вызвать ошибку. Может быть, вы ограничивали acces_token длину при создании таблицы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...