1

当用户在应用程序启动时输入它时,我正在从我的 Main 类中设置一个 id。考虑到我将它设置在一个名为 GetSet.java 的类中,该类也有一个在被调用时返回它的方法。所以我需要一个名为 MySQLitehelper.java 的类中的第一个类的 id 集,这样我就可以根据 id 集检索数据,而不是对其进行硬编码。这将使我的应用程序动态而不是静态。这是我的代码:

/----MainActivity.java-----/ _ _

public class MainActivity extends Activity {

EditText etGWid;
Button OKbtn;

public final static String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    etGWid = (EditText)findViewById(R.id.etGWID);
    OKbtn = (Button)findViewById(R.id.OKbtn);

    final GetSet obj_getset = new GetSet();
    //MySQLitehelper db = new MySQLitehelper(null);

    final SharedPreferences app_preferences = PreferenceManager.getDefaultSharedPreferences(this);  
            // Create a shared preferences variable using the SharedPreferenceManager for storing GWids

    SharedPreferences.Editor editor = app_preferences.edit();  // We also need a shared preferences editor to handle the shared preference requests
    // Call the edit method (library function) to editor variable can edit the key, values.

    editor.putInt("47688507", 47688507);   // put in the shared preferences values of user GWids and give them a key for retrieval purposes
    editor.putInt("1234567", 1234567);
    editor.putInt("7654321", 7654321);

    editor.commit();   //commit is necessary to save the shared preferences



    OKbtn.setOnClickListener(new View.OnClickListener() {


        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub

            String gwidCheck = etGWid.getText().toString();  //get the value user enters for GWid

            if(app_preferences.contains(gwidCheck))       // this will check the stored shared preferences and compare with the value entered
            {
                Context context = getApplicationContext();
                CharSequence text = "Login Successfull";
                int duration = Toast.LENGTH_SHORT;                              //If it exists, then create a toast message for success



                //etGWid.setText("");    // make the textbox empty
                long setid = Long.parseLong(gwidCheck);   // take the string gwid and convert to long
                obj_getset.setId(setid);    // set the gwid entered



                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
                intentfunction();
            } 
            else
            {
                Context context = getApplicationContext();
                CharSequence text = "Login Failed";                     // If doesnt exist, create a toast for fail
                int duration = Toast.LENGTH_SHORT;

                Toast toast = Toast.makeText(context, text, duration);
                toast.show();
            }

        }
    });
}


private void intentfunction()
{
     Intent intent = new Intent(this, SelectOptions.class);
     //editText = (EditText) findViewById(R.id.editText1);
     //editText = new EditText(this);
     etGWid.setText("");   //set the edit text to blank
    String message = "TestHello";
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);

}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

}

/*-----GetSet.java----*/

public class GetSet {

long gwid=0;

public void setId(long id)
{
    gwid = id;
}

public long getId()
{
    return gwid;
}

}

/ ---MySQLitehelper.java--- /

public class MySQLitehelper {

//public static final String TABLE_COMMENTS = "comments";
  public static final String COLUMN_ID = "GWid";
  public static final String COLUMN_DATE = "DateGWU";
  public static final String COLUMN_LOCATION = "location";
  public static final String COLUMN_TIME = "time";

  public static final String TABLE_NAME = "UPDTable";

  private static final String DATABASE_NAME = "UPDdb_version6";
  private static final int DATABASE_VERSION = 6;

  private final Context context;
  GetSet getset = new GetSet();
  public void GetIdForGwid(GetSet get)
  {
     getset=get; 
  }

  // Database creation sql statement
  private static final String DATABASE_CREATE = "CREATE TABLE " + TABLE_NAME +
                                " (" +COLUMN_ID+ " integer," + COLUMN_DATE + " VARCHAR," +
                                COLUMN_LOCATION+" VARCHAR," +COLUMN_TIME +" VARCHAR);";

//  private static final String DATABASE_INSERT = "INSERT INTO " +TABLE_NAME +
//                                              " Values (47688507,'DEC-07-2012','MARVIN 203','20:00');";

  private static final String DATABASE_INSERT = "INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +
          COLUMN_LOCATION+" ," +COLUMN_TIME +" )"  +
                          " Values (47688507,'DEC-07-2012','MARVIN 203','20:00');";



  DatabaseHelper dbhelper;
  SQLiteDatabase db;




 public MySQLitehelper(Context ctx)
  {
      this.context = ctx;
      dbhelper = new DatabaseHelper(ctx);
  }



private static class DatabaseHelper extends SQLiteOpenHelper {

     public DatabaseHelper(Context context)
     {
         super(context,DATABASE_NAME, null,DATABASE_VERSION);
     }

 @Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(DATABASE_CREATE);            //execute create table
    db.execSQL(DATABASE_INSERT);            //execute insert query
    db.execSQL("INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +COLUMN_LOCATION+" ," +COLUMN_TIME +" )" +" Values (47688507,'DEC-22-2012','OLD MAIN','23:00');");
    db.execSQL("INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +COLUMN_LOCATION+" ," +COLUMN_TIME +" )" +" Values (1234567,'DEC-14-2012','FUNGER','12:00');");
    db.execSQL("INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +COLUMN_LOCATION+" ," +COLUMN_TIME +" )" +" Values (7654321,'DEC-29-2012','GELMAN','22:00');");
    db.execSQL("INSERT INTO " +TABLE_NAME +  " (" +COLUMN_ID+ " ," + COLUMN_DATE + "," +COLUMN_LOCATION+" ," +COLUMN_TIME +" )" +" Values (47688507,'DEC-12-2012','IVORY','23:00');");
 }

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    Log.w(MySQLitehelper.class.getName(),
            "Upgrading database from version " + oldVersion + " to "
                + newVersion + ", which will destroy all old data");
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}


// open the DB
 public MySQLitehelper open() throws SQLException
 {
    System.out.println("Inside open function");
     db = dbhelper.getWritableDatabase();
    return this;
 }

 public void close()
 {
     dbhelper.close();
 }



 public void insertRecord(long gwid, String date, String location, String time)
     {
           ContentValues initialValues = new ContentValues();
          initialValues.put(COLUMN_ID, gwid);
          initialValues.put(COLUMN_DATE, date);
          initialValues.put(COLUMN_LOCATION, location);
          initialValues.put(COLUMN_TIME, time);
          db.insert(TABLE_NAME, null, initialValues);
     }

public Cursor getAllrows()      //function to get all rows in the DB. Testing initially.
{

     Cursor cur = db.rawQuery("SELECT * FROM "+TABLE_NAME, null);
     return cur;
}

public Cursor getRecord() throws SQLException
{
        Cursor mCursor =
        db.query(true, TABLE_NAME, new String[] {COLUMN_ID,
        COLUMN_DATE, COLUMN_LOCATION, COLUMN_TIME},
        COLUMN_ID + "= 47688507", null, null, null, null, null);   //HARDCODED. Please make it dynamic
        if (mCursor != null) 
        {
            mCursor.moveToFirst();
        }
 return mCursor;
 }

}

我正在底部的上述类中的 getRecord() 方法中检索它,而不是COLUMN_ID + "= 47688507我希望从GetSet类(getId方法)中获取设置值并将其替换为47688507. 有什么建议么 ?

4

3 回答 3

3

阅读“单例模式”,这是一种创建持久对象以保存要从一个地方传递到另一个地方的信息的方法。

但是,请记住,一旦onPause()在您的 Activity 上被调用,系统就可以完全销毁您的应用程序,并在以后重建它。这意味着即使是单例类也不能保证在您的应用程序重新启动时您的数据会在那里。您必须始终准备好在 onCreate() 方法中从持久存储中恢复您的状态。

下面是我如何使用单例类来实现全局首选项持有者: 简而言之,任何有 Context 的地方,都可以调用 Prefs.getPrefs() 来获取首选项对象。在第一次调用时,它将从持久存储中读取首选项。在所有后续调用中,它只返回指向已加载对象的指针。如果您的应用程序被系统杀死并重新启动,getPrefs() 会根据需要无缝地重新读取首选项。

/**
 * This is a singleton class to hold preferences.
 */
public class Prefs {
    private static volatile Prefs instance = null;

    // The values held by this class
    String identity = null;
    String apiUrl = "http://example.com/cgi-bin/api";
    int interval = 3600;    // when there's no activity

    /**
     * Return the single instance of this class, creating it
     * if necessary. This method is thread-safe.
     */
    public static Prefs getPrefs(Context ctx) {
        if (instance == null) {
            synchronized(Prefs.class) {
                if (instance == null) {
                    instance = new Prefs();
                    instance.readPrefs(ctx);
                }
            }
        }
        return instance;
    }

    /**
     * Re-read all preferences (you never need to call this explicitly)
     */
    private void readPrefs(Context ctx) {
        try {
            SharedPreferences sp =
                PreferenceManager.getDefaultSharedPreferences(ctx);
            identity = sp.getString("identity", identity);
            apiUrl = sp.getString("apiUrl", apiUrl);
            interval = sp.getInt("interval", interval);
        } catch (Exception e) {
            Log.e(TAG, "exception reading preferences: " + e, e);
            // TODO: report it
        }
    }

    /**
     * Save preferences; you can call this from onPause()
     */
    public void savePrefs(Context ctx) {
        try {
            SharedPreferences.Editor sp =
              PreferenceManager.getDefaultSharedPreferences(ctx).edit();
            sp.putString("identity", identity);
            sp.putString("apiUrl", apiUrl);
            sp.putInt("interval", interval);
            sp.commit();
        } catch (Exception e) {
            Log.e(TAG, "exception reading preferences: " + e, e);
            // TODO: report it
        }
    }

    /**
     * Save preferences to a bundle. You don't really need to implement
     * this, but it can make start-up go faster.
     * Call this from onSaveInstanceState()
     */
    public void onSaveInstanceState(Bundle state) {
        state.putString("identity", identity);
        state.putString("apiUrl", apiUrl);
        state.putInt("interval", interval);
    }

    /**
     * Recall preferences from a bundle. You don't really need to implement
     * this, but it can make start-up go faster.
     * Call this from onCreate()
     */
    public void restoreInstanceState(Bundle state) {
        identity = state.getString("identity");
        apiUrl = state.getString("apiUrl");
        interval = state.getInt("interval");
    }
}
于 2012-12-02T19:54:10.640 回答
1
  • 使用全局单例来存储和检索数据。执行此操作时,请确保单例不包含对您的活动或上下文的引用。
  • 由于 mysqlitehelper 具有对上下文的引用,因此您还可以从 SharedPreferences 中检索持久数据。
  • -
于 2012-12-02T16:03:37.457 回答
0

我认为,您应该能够使用您的实例变量obj_getset来设置 id

obj_getset.setid(mCursor.COLUMN_ID)

在您的getRecord函数中,然后在需要时以相同的方式检索它

obj_getset.getID()

于 2012-12-02T16:01:01.430 回答