我有一个活动,其中包含控制我的数据库的所有函数,我希望在与数据库交互时所有其他活动都用于这些函数。以下是我的问题的一个例子。
时钟脚本:
public class Clock extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_clock);
Data.createTable(); //<<<
}
//...
}
数据脚本:
public class Data extends Activity
{
SQLiteDatabase mydb;
private static String DBNAME = "SHIFTS.db";
private static String TABLE = "MY_SHIFTS";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_data);
}
public void createTable() //<<<
{
try
{
mydb = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
mydb.execSQL("CREATE TABLE IF NOT EXISTS "+ TABLE +" (ID INTEGER PRIMARY KEY, STARTDATE TEXT, ENDDATE TEXT, LENGTH INTEGER, TYPE INTEGER);");
mydb.close();
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(), "Error in creating table", Toast.LENGTH_LONG).show();
}
}
// ... lots more functions
}
错误讯息:
无法对非静态方法createTable()进行静态引用 来自数据类型。
当我尝试使方法静态时,它只会导致更多问题。
另外,如果我尝试Data data = new Data(); data.createTable();我得到一个NullPointerException。
这里有什么问题?
答案 0 :(得分:12)
将static关键字添加到共享方法
public static void createTable()
然后使用:
Data.createTable();
在另一个Class / Fragment / Activity中的某个地方。
我这样做并且有效。
好吧,我的“数据”是一个普通的类,而不是一个Activity,但我也有一个带有共享方法的Activity,方法相同。
这是我的dbTableCreate方法:
// Create the database table if it doesn't exist
protected final static void dbTableCreate(final Context ctx)
{
SQLiteDatabase db = null;
try
{
db = ctx.openOrCreateDatabase(DB_NAME, Context.MODE_PRIVATE, null);
db.execSQL
(
"CREATE TABLE IF NOT EXISTS " + DB_TABLE +
" (date DATETIME PRIMARY KEY NOT NULL DEFAULT (CURRENT_DATE), " +
"score INTEGER DEFAULT (null));"
);
}
catch (final SQLiteException se)
{
System.out.println
(
ctx.getClass().getSimpleName() + "\n" +
"Could not create the database"
);
se.printStackTrace();
}
finally
{
db.close();
}
}
我称之为:
Context ctx = getApplicationContext();
CLS_DB.dbTableCreate(ctx);
我和你的班级之间的主要区别在于我的班级被宣布为
public final class CLS_DB
{
/* ----------------------------- Constants ------------------------------ */
private final static String DB_NAME = "pat.db";
private final static String DB_TABLE = "tests";
/* ------------------------------ Methods ------------------------------- */
而不是活动。
我没有初始化类,它没有构造函数
它只是一个共享的bin(而不是用于执行我的代码中其他任何地方都没有看到的操作)方法。
答案 1 :(得分:2)
我会在单个http://en.wikipedia.org/wiki/Singleton_pattern中拥有所有与DB相关的方法。 我会将上下文发送给该单例,或者仅发送静态方法。
我认为将活动作为数据库管理员并不是一个好主意。
答案 2 :(得分:0)
使用java标准的最佳方法是make Singleton类Database.Put此类中的所有这些共享方法。应用程序中的所有活动都将使用此Singleton类执行数据库操作。
答案 3 :(得分:-2)
我正在关注这个问题并根据Android_Dev的回答我对我的代码进行了更改,如下所示
第一堂课
class blah extends activity {
//// onCreate , initialization etc here
public void sss(context c)
{
Toast(c , "text" , toast.LENTGH_LONG) ;
}
}
第二课
public xxxx extends activity
{
Context c = getApplicationContext();
blah b = new blah(this) ;
/// inside an onclicklistener attached to a button object, i put this
b.sss(c) ;
}
我没有包含通常在扩展Activity类的类中找到的所有其他东西,因为我只想展示我从其他类调用函数所做的事情。 这个解决方案非常适合我。虽然
可能对其他人有用或可能没用