首页 > 解决方案 > SharedPreferences - 静态类中的静态字符串?

问题描述

Java新手,很抱歉我的理解很差。我遇到了一个小障碍,我有一个用于连接服务器的静态类。我正在使用另一个类SharedPreferences,其中一些细节是SharedPreferences要连接的服务器地址。

当我开始SharedPreferences在我的静态Connection类中使用该类时,我遇到了一个缺陷,即我无法在静态上下文中使用非静态字段。

有没有办法解决?我可以将值设置为静态吗?或者无论如何加载这些值并保持它们是静态的?

我会SharedPreferences从任何活​​动中获取我的:

String sName = SharedPrefs.getserverName(this);

但无论如何,我在我的静态Connection类中引用了这个,我感到很笨拙:

None-Static field XXXXXX cannot be referenced from a static context

(显然我不能只在手头包含静态这个词,因为它失败了,因为“这不能从静态上下文中引用”。)

SharedPreference班级:

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

public static String getserverName(Context context) {
    return getPrefs(context).getString("server_name", "");
}

我相信我已经正确使用了静态。

根据要求连接类:

public class ConnectionManager extends AppCompatActivity {
    static StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    static String serverName = SharedPrefs.getserverName(Context);
//  static String serverName ="192.168.1.105";   //TODO Ensure Database details loaded from Shared Preferences
    static String serverPort ="1433";
    static String databaseName ="DBANAME";
    static String db = String.format("jdbc:jtds:sqlserver://%s:%s/%s", serverName, serverPort, databaseName);
    static String un = "sa";
    static String pass = "";
    static Connection con;


    public static Connection getConnection() {

        try {
            try {
                StrictMode.setThreadPolicy(policy);
                Class.forName("net.sourceforge.jtds.jdbc.Driver");
                con = DriverManager.getConnection(db, un, pass);
            } catch (SQLException ex) {
                // log an exception. fro example:
                System.out.println("Failed to create the database connection.");
            }
        } catch (ClassNotFoundException ex) {
            // log an exception. for example:
            System.out.println("Driver not found.");
        }
        return con;
    }
}

查询活动(调用数据库连接类)

        try {

            con = ConnectionManager.getConnection();
            if (con == null) {
                z = "Check Your Internet Access!";
                Toast.makeText(StockEnquiry.this, z, Toast.LENGTH_LONG).show();
            } else 

更新

在 user1506104 的帮助下,我得到了这个工作。我将 Call for SharedPref 移至 getConnection 内部并包含 Context 上下文。像这样:

public static Connection getConnection(Context context) {
String serverName = SharedPrefs.getserverName(context);
String serverPort = SharedPrefs.getserverPort(context);
String databaseName = SharedPrefs.getdatabaseName(context);
String sPath = SharedPrefs.getserverPath(context);
String db = String.format("jdbc:jtds:sqlserver://%s:%s/%s", serverName, serverPort, databaseName);
try {
    try {
        StrictMode.setThreadPolicy(policy);
        Class.forName("net.sourceforge.jtds.jdbc.Driver");
        con = DriverManager.getConnection(db, un, pass);
    } catch (SQLException ex) {
        // log an exception. fro example:
        System.out.println("Failed to create the database connection.");
    }
} catch (ClassNotFoundException ex) {
    // log an exception. for example:
    System.out.println("Driver not found.");
}
return con;

}

然后在我的活动中,我只需要将它包含在 getConnection() 中,如下所示:

   con = ConnectionManager.getConnection(this);

感谢您的时间 :)

标签: javaandroid

解决方案


如果您从活动内部调用此代码是可以的,因为this关键字指的是您当前的活动实例。

String sName = SharedPrefs.getserverName(this);

确保您在静态 Connection 类中引用了上下文对象。假设您的上下文对象被context变量引用,请执行以下操作:

String sName = SharedPrefs.getserverName(context);

推荐阅读