2014-04-28 30 views
6

Tôi đang cố gắng tạo một lớp KeyValueDB lưu trữ các phương thức để tương tác với SharedPreferences, tuy nhiên tôi đang gặp sự cố khi chỉ định lớp. Tất cả những gì tôi muốn constructor làm là lưu một đối tượng sharedPreferences với tên file chính xác, nhưng tôi nhận được một phương thức "cannot resolve method" getSharedPreferences (java.lang.String, int) 'Lỗi "không thể giải quyết" khi cố triển khai getSharedPreferences trong Android Studio

Tôi đang truyền một String và một . int ... tôi không chắc chắn những gì tôi đang làm sai Coi trọng bất kỳ sự giúp đỡ

package com.farmsoft.lunchguru.utils; 

import android.content.Context; 
import android.content.SharedPreferences; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

import org.json.JSONException; 

/** 
* Created by sxs on 4/28/2014. 
*/ 
public class KeyValueDB { 
    private SharedPreferences sharedPreferences; 

    public KeyValueDB(String prefName) { 
     sharedPreferences = getSharedPreferences(prefName, Context.MODE_PRIVATE); 
    } 
+0

Bạn cần đối tượng Context cho phiên bản SharedPreferences: http://developer.android.com/reference/android/content/Context.html#getSharedPreferences%28java.lang.String,%20int%29 – Benjamin

Trả lời

30

getSharedPreferences() cần một ngữ cảnh để truy cập.

Ví dụ:

mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); 

Bạn cần phải hoặc vượt qua bối cảnh vào constructor cho KeyValueDB, hay một cách tốt hơn sẽ được truy cập mà tĩnh.

tôi sẽ làm điều này

public class KeyValueDB { 
private SharedPreferences sharedPreferences; 
private static String PREF_NAME = "prefs"; 

    public KeyValueDB() { 
    // Blank 
    } 

    private static SharedPreferences getPrefs(Context context) { 
     return context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE); 
    } 

    public static String getUsername(Context context) { 
     return getPrefs(context).getString("username_key", "default_username"); 
    } 

    public static void setUsername(Context context, String input) { 
     SharedPreferences.Editor editor = getPrefs(context).edit(); 
    editor.putString("username_key", input); 
    editor.commit(); 
    } 
} 

Chỉ cần lặp lại những get và set phương pháp đối với bất kỳ thông tin mà bạn cần lưu trữ.

Để truy cập chúng từ một hoạt động, bạn sẽ làm điều này:

String username = KeyValueDB.getUsername(this); 

đâu "này" là một tham chiếu đến các hoạt động. Nó cũng thực hành tốt để thiết lập một bối cảnh trong từng hoạt động trong phương pháp onCreate(), như:

public class myActivity extends Activity{ 

Context mContext; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mContext = this; 

    String username = KeyValueDB.getUsername(mContext); 
} 

EDIT tháng 7 năm 2016

để đáp ứng với @RishirajPurohit dưới đây, để đặt tên người dùng bạn làm rất nhiều điều tương tự:

KeyValueDB.setUsername(mContext, "DesiredUsername"); 

Từ đó tất cả mọi thứ được thực hiện cho bạn trong lớp tĩnh trước, sự thay đổi cam kết các ưu đãi file chia sẻ và vẫn kiên trì và sẵn sàng để được lấy ra bằng phương pháp get.

Chỉ cần một lưu ý về phương thức get, trong trường hợp ai thắc mắc:

public static String getUsername(Context context) { 
    return getPrefs(context).getString("username_key", "default_username"); 
} 

"default_username" là chính xác như nó có vẻ. Nếu phương thức nhận được đó được gọi trước trước khi tên người dùng được đặt, đó là giá trị được trả về. Ít hữu ích hơn trong trường hợp này, nhưng khi bạn bắt đầu sử dụng các giá trị Số nguyên và Boolean, điều này rất hữu ích để đảm bảo tính chắc chắn.

+0

Cảm ơn!Đó là một câu trả lời toàn diện tuyệt vời – Scott

+0

@ Kryten2k35 câu trả lời của bạn là sạch sẽ và rất hữu ích. Cảm ơn bạn. –

+0

và khi tôi muốn set_username? giống như nó đúng không? –

1

Bạn phải vượt qua một bối cảnh có ...

ví dụ về nhận được một chuỗi giá trị:

public static String getUserName(Context ctx) 
{ 
    return getSharedPreferences(ctx).getString(PREF_USER_NAME, ""); 
} 

trong đó PREF_USER_NAME là khóa và thông số thứ hai là khi không thể tìm thấy khóa, nó trả về ""

Các vấn đề liên quan