SharedPreferences-静态类中的静态字符串?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的帮助下,我开始工作了。我将对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);

谢谢您的时间:)

答案

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

String sName = SharedPrefs.getserverName(this);

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

String sName = SharedPrefs.getserverName(context);
另一答案

请使用Singleton Design模式。这是一个很好的编程习惯。创建静态类具有上述问题。这是android中单例模式的博客https://medium.com/@programmerr47/singletons-in-android-63ddf972a7e7

以上是关于SharedPreferences-静态类中的静态字符串?的主要内容,如果未能解决你的问题,请参考以下文章

类中的静态/非静态方法

绑定到 WPF 中静态类中的静态属性

类中静态方法

C++ 类中的静态成员变量,静态成员函数

java 多线程3:Thread类中的静态方法

我可以使用 VS2010 PrivateObject 访问静态类中的静态字段吗?