java - 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);
感谢您的时间 :)
解决方案
如果您从活动内部调用此代码是可以的,因为this
关键字指的是您当前的活动实例。
String sName = SharedPrefs.getserverName(this);
确保您在静态 Connection 类中引用了上下文对象。假设您的上下文对象被context
变量引用,请执行以下操作:
String sName = SharedPrefs.getserverName(context);
推荐阅读
- angular - Angular Material:mat-form-field 在创建自定义表单域控件时必须包含一个 MatFormFieldControl
- haskell - Haskell:无法导入 System.Random
- snowflake-cloud-data-platform - 直接使用外部表暂存 S3 文件
- c# - C# 的命令行代码没有按正确的顺序运行?
- spring - Spring Boot 条件 jpa 属性
- python - 在 pandas 数据框和回填中将年扩展到月
- leaflet - 使用 Leaflet 自动完成位置:自定义设计?
- c - 从 TLS TCP 套接字读取时收到乱码
- angular - 错误 TS2339:“对象”类型上不存在属性“funcionarios”
- java - Spring Security:无法让真正的用户使用显示过期的 SessionRegistry 登录