如何在几个地方保存数据
How to save data in a few places
如何将数据库中的数据放在多个位置以保存不同的数据。我不知道这是否是一个完全可以理解的问题,这就是为什么我会尝试将它们拉近一点。
我想保存一周中每一天的菜名:
即我有一个包含星期几名称的列表:
- 周一,
- 周二,
- 周三,
- 周四,
- 星期五,
- 周六,
- 周日
现在我想在选择特定日期时将各种菜肴保存在那里。例如,星期一,切碎+土豆,星期二-意大利面等。我知道我将不得不使用不同的表格将信息放在那里,但如果我想每天写点别的东西,我不知道该怎么做。我是否必须为一周中的每一天创建单独的 Activity 并为那里的特定日期创建单独的表格?
我没有输入任何代码,我没有问题,只是我无法知道的问题。
I know that I will have to use different tables to put information
there
不一定:-
您可以在 菜肴 table 中为一周中的每一天设置一列。
您可以有一个列可用于一周中的所有天数。
例如如果星期一被分配值 1,星期二 2,星期三 4,星期四 8、16、32、64。(即 2 的星期几 (1-7) 次方)。
然后,如果这道菜是星期一和星期四的菜,那么您可以存储一个值,该值由逻辑或运算相应的日期 1(星期一)和 8(星期四)逻辑或运算组成将是 9;添加星期五 (16) 存储的值将是 25。
假设是后者,然后您可以提取 (其中 daysused 是指示菜肴应出现在菜单上的日期的列):-
星期一菜单使用:-
SELECT * from dishes WHERE (daysused & 1) > 0
周五菜单使用:-
SELECT * from dishes WHERE (daysused & 16) > 0
周末菜单使用:-
SELECT * from dishes WHERE (daysused & (32 | 64)) > 0
Do I have to create a separate Activity for each day of the week and
create separate tables for a specific day there?
没有。您可以有一个通用的 activity,也许带有一个指向 select 星期几的按钮,或者一个微调器或一个单选组。
Clicking/selecting 将计算天数,然后用于确定要查看的天数,该值将按照上述行输入 selection 标准。生成的 Cursor 然后可以用作 ListView 的源来显示菜单。
示例:-
数据库助手
public class MyMenuDBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mymenu";
public static final int DBVERSION = 1;
public static final String DISHES_TABLE = "dishes";
public static final String DISHES_ID_COL = BaseColumns._ID;
public static final String DISHES_NAME_COL = "dishes_name";
public static final String DISHES_DAYSONMENU_COL = "dishes_daysonmenu";
MyMenuDBHelper(Context context) {
super(context,DBNAME,null,DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String crtSQL = "CREATE TABLE IF NOT EXISTS " +
DISHES_TABLE + "(" +
DISHES_ID_COL + " INTEGER PRIMARY KEY, " +
DISHES_NAME_COL + " TEXT, " +
DISHES_DAYSONMENU_COL + " INTEGER " +
")";
db.execSQL(crtSQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long addDish(String name,
boolean usemonday,
boolean usetuesday,
boolean usewednesday,
boolean usethursday,
boolean usefriday,boolean usesaturday, boolean usesunday) {
int daysused = MainActivity.NODAYS_FLAG;
if (usemonday) daysused = daysused | MainActivity.MONDAY_FLAG;
if (usetuesday) daysused = daysused | MainActivity.TUESDAY_FLAG;
if (usewednesday) daysused = daysused | MainActivity.WEDNESDAY_FLAG;
if (usethursday) daysused = daysused | MainActivity.THURSDAY_FLAG;
if (usefriday) daysused = daysused | MainActivity.FRIDAY_FLAG;
if (usesaturday) daysused = daysused | MainActivity.SATURDAY_FLAG;
if (usesunday) daysused = daysused | MainActivity.SUNDAY_FLAG;
ContentValues cv = new ContentValues();
cv.put(DISHES_NAME_COL,name);
cv.put(DISHES_DAYSONMENU_COL,daysused);
return this.getWritableDatabase().insert(DISHES_TABLE,null,cv);
}
public Cursor getMenu(int daystoinclude) {
// SQL SELECT * FROM dishes WHERE (dishes_daysonmenu & the_daystoshow_as_passed) > 0
Cursor csr = this.getWritableDatabase().query(DISHES_TABLE,null,
"(" + DISHES_DAYSONMENU_COL + " & ?) > 0",
new String[]{Integer.toString(daystoinclude)},
null,null,null
);
int count = csr.getCount(); //<<< Just for debugging breakpoint
return csr;
}
}
"Single Activity"-MainActivity
public class MainActivity extends AppCompatActivity {
public static final String TEST = "test";
public static final int MONDAY_FLAG = 1 << 0;
public static final int TUESDAY_FLAG = 1 << 1;
public static final int WEDNESDAY_FLAG = 1 << 2;
public static final int THURSDAY_FLAG = 1 << 3;
public static final int FRIDAY_FLAG = 1 << 4;
public static final int SATURDAY_FLAG = 1 << 5;
public static final int SUNDAY_FLAG = 1 << 6;
public static final int NODAYS_FLAG = 0;
Button[] daybuttonids = new Button[7];
ListView mMenuList;
MyMenuDBHelper mDBHelper;
Cursor mCsr;
SimpleCursorAdapter mSCA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
daybuttonids[0] = (Button) this.findViewById(R.id.mon);
daybuttonids[1] = (Button) this.findViewById(R.id.tue);
daybuttonids[2] = (Button) this.findViewById(R.id.wed);
daybuttonids[3] = (Button) this.findViewById(R.id.thu);
daybuttonids[4] = (Button) this.findViewById(R.id.fri);
daybuttonids[5] = (Button) this.findViewById(R.id.sat);
daybuttonids[6] = (Button) this.findViewById(R.id.sun);
mMenuList = this.findViewById(R.id.menulist);
mDBHelper = new MyMenuDBHelper(this);
addSomeDishes();
mCsr = mDBHelper.getMenu(NODAYS_FLAG);
mSCA = new SimpleCursorAdapter(
this, // Context
android.R.layout.simple_list_item_1, // layout
mCsr, // Cursor
new String[]{MyMenuDBHelper.DISHES_NAME_COL}, // column(s)
new int[]{android.R.id.text1}, // View
0 // flags
);
mMenuList.setAdapter(mSCA);
setButtonListeners();
}
private void setButtonListeners() {
for (int i=0; i < daybuttonids.length; i++) {
daybuttonids[i].setTag(new Integer(i));
daybuttonids[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int daytouse = 1 << Integer.valueOf(v.getTag().toString());
Log.d("DAYTOUSE","Day to use is " + Integer.toString(daytouse));
refreshList(daytouse);
}
});
}
}
private void refreshList(int daystoshowinmenu) {
mCsr = mDBHelper.getMenu(daystoshowinmenu);
mSCA.swapCursor(mCsr);
}
private void addSomeDishes() {
mDBHelper.getWritableDatabase().delete(MyMenuDBHelper.DISHES_TABLE,null,null);
mDBHelper.addDish("Chip and Fishes",true,false,false,false,true,false,true);
mDBHelper.addDish("Egg under Toast", false,true, false, false,false,true,true);
mDBHelper.addDish("Mashed Bangers", true, false,true,false,true,false,true);
}
}
应用程序的外观:-
- 最初(没有使用 NODAYS 作为光标)
- 单击了星期一按钮
- 星期二 单击按钮:-
- ...星期日按钮被点击:-
当然你可以有多个 tables,
也许你会有一个 table 用于菜肴,另一个 table 用于日常菜单,后者具有当天和菜肴的指示器(即 reference/link/association到盘子里)。如果您想记录每天供应的菜肴,这将是更好的选择,因为 dish/day 的每个组合都可以被唯一标识,并且可以包含一列用于计算使用次数。
如何将数据库中的数据放在多个位置以保存不同的数据。我不知道这是否是一个完全可以理解的问题,这就是为什么我会尝试将它们拉近一点。
我想保存一周中每一天的菜名:
即我有一个包含星期几名称的列表: - 周一, - 周二, - 周三, - 周四, - 星期五, - 周六, - 周日
现在我想在选择特定日期时将各种菜肴保存在那里。例如,星期一,切碎+土豆,星期二-意大利面等。我知道我将不得不使用不同的表格将信息放在那里,但如果我想每天写点别的东西,我不知道该怎么做。我是否必须为一周中的每一天创建单独的 Activity 并为那里的特定日期创建单独的表格?
我没有输入任何代码,我没有问题,只是我无法知道的问题。
I know that I will have to use different tables to put information there
不一定:-
您可以在 菜肴 table 中为一周中的每一天设置一列。
您可以有一个列可用于一周中的所有天数。
例如如果星期一被分配值 1,星期二 2,星期三 4,星期四 8、16、32、64。(即 2 的星期几 (1-7) 次方)。
然后,如果这道菜是星期一和星期四的菜,那么您可以存储一个值,该值由逻辑或运算相应的日期 1(星期一)和 8(星期四)逻辑或运算组成将是 9;添加星期五 (16) 存储的值将是 25。
假设是后者,然后您可以提取 (其中 daysused 是指示菜肴应出现在菜单上的日期的列):-
星期一菜单使用:-
SELECT * from dishes WHERE (daysused & 1) > 0
周五菜单使用:-
SELECT * from dishes WHERE (daysused & 16) > 0
周末菜单使用:-
SELECT * from dishes WHERE (daysused & (32 | 64)) > 0
Do I have to create a separate Activity for each day of the week and create separate tables for a specific day there?
没有。您可以有一个通用的 activity,也许带有一个指向 select 星期几的按钮,或者一个微调器或一个单选组。
Clicking/selecting 将计算天数,然后用于确定要查看的天数,该值将按照上述行输入 selection 标准。生成的 Cursor 然后可以用作 ListView 的源来显示菜单。
示例:-
数据库助手
public class MyMenuDBHelper extends SQLiteOpenHelper {
public static final String DBNAME = "mymenu";
public static final int DBVERSION = 1;
public static final String DISHES_TABLE = "dishes";
public static final String DISHES_ID_COL = BaseColumns._ID;
public static final String DISHES_NAME_COL = "dishes_name";
public static final String DISHES_DAYSONMENU_COL = "dishes_daysonmenu";
MyMenuDBHelper(Context context) {
super(context,DBNAME,null,DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String crtSQL = "CREATE TABLE IF NOT EXISTS " +
DISHES_TABLE + "(" +
DISHES_ID_COL + " INTEGER PRIMARY KEY, " +
DISHES_NAME_COL + " TEXT, " +
DISHES_DAYSONMENU_COL + " INTEGER " +
")";
db.execSQL(crtSQL);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long addDish(String name,
boolean usemonday,
boolean usetuesday,
boolean usewednesday,
boolean usethursday,
boolean usefriday,boolean usesaturday, boolean usesunday) {
int daysused = MainActivity.NODAYS_FLAG;
if (usemonday) daysused = daysused | MainActivity.MONDAY_FLAG;
if (usetuesday) daysused = daysused | MainActivity.TUESDAY_FLAG;
if (usewednesday) daysused = daysused | MainActivity.WEDNESDAY_FLAG;
if (usethursday) daysused = daysused | MainActivity.THURSDAY_FLAG;
if (usefriday) daysused = daysused | MainActivity.FRIDAY_FLAG;
if (usesaturday) daysused = daysused | MainActivity.SATURDAY_FLAG;
if (usesunday) daysused = daysused | MainActivity.SUNDAY_FLAG;
ContentValues cv = new ContentValues();
cv.put(DISHES_NAME_COL,name);
cv.put(DISHES_DAYSONMENU_COL,daysused);
return this.getWritableDatabase().insert(DISHES_TABLE,null,cv);
}
public Cursor getMenu(int daystoinclude) {
// SQL SELECT * FROM dishes WHERE (dishes_daysonmenu & the_daystoshow_as_passed) > 0
Cursor csr = this.getWritableDatabase().query(DISHES_TABLE,null,
"(" + DISHES_DAYSONMENU_COL + " & ?) > 0",
new String[]{Integer.toString(daystoinclude)},
null,null,null
);
int count = csr.getCount(); //<<< Just for debugging breakpoint
return csr;
}
}
"Single Activity"-MainActivity
public class MainActivity extends AppCompatActivity {
public static final String TEST = "test";
public static final int MONDAY_FLAG = 1 << 0;
public static final int TUESDAY_FLAG = 1 << 1;
public static final int WEDNESDAY_FLAG = 1 << 2;
public static final int THURSDAY_FLAG = 1 << 3;
public static final int FRIDAY_FLAG = 1 << 4;
public static final int SATURDAY_FLAG = 1 << 5;
public static final int SUNDAY_FLAG = 1 << 6;
public static final int NODAYS_FLAG = 0;
Button[] daybuttonids = new Button[7];
ListView mMenuList;
MyMenuDBHelper mDBHelper;
Cursor mCsr;
SimpleCursorAdapter mSCA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
daybuttonids[0] = (Button) this.findViewById(R.id.mon);
daybuttonids[1] = (Button) this.findViewById(R.id.tue);
daybuttonids[2] = (Button) this.findViewById(R.id.wed);
daybuttonids[3] = (Button) this.findViewById(R.id.thu);
daybuttonids[4] = (Button) this.findViewById(R.id.fri);
daybuttonids[5] = (Button) this.findViewById(R.id.sat);
daybuttonids[6] = (Button) this.findViewById(R.id.sun);
mMenuList = this.findViewById(R.id.menulist);
mDBHelper = new MyMenuDBHelper(this);
addSomeDishes();
mCsr = mDBHelper.getMenu(NODAYS_FLAG);
mSCA = new SimpleCursorAdapter(
this, // Context
android.R.layout.simple_list_item_1, // layout
mCsr, // Cursor
new String[]{MyMenuDBHelper.DISHES_NAME_COL}, // column(s)
new int[]{android.R.id.text1}, // View
0 // flags
);
mMenuList.setAdapter(mSCA);
setButtonListeners();
}
private void setButtonListeners() {
for (int i=0; i < daybuttonids.length; i++) {
daybuttonids[i].setTag(new Integer(i));
daybuttonids[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int daytouse = 1 << Integer.valueOf(v.getTag().toString());
Log.d("DAYTOUSE","Day to use is " + Integer.toString(daytouse));
refreshList(daytouse);
}
});
}
}
private void refreshList(int daystoshowinmenu) {
mCsr = mDBHelper.getMenu(daystoshowinmenu);
mSCA.swapCursor(mCsr);
}
private void addSomeDishes() {
mDBHelper.getWritableDatabase().delete(MyMenuDBHelper.DISHES_TABLE,null,null);
mDBHelper.addDish("Chip and Fishes",true,false,false,false,true,false,true);
mDBHelper.addDish("Egg under Toast", false,true, false, false,false,true,true);
mDBHelper.addDish("Mashed Bangers", true, false,true,false,true,false,true);
}
}
应用程序的外观:-
- 最初(没有使用 NODAYS 作为光标)
- 单击了星期一按钮
- 星期二 单击按钮:-
- ...星期日按钮被点击:-
当然你可以有多个 tables,
也许你会有一个 table 用于菜肴,另一个 table 用于日常菜单,后者具有当天和菜肴的指示器(即 reference/link/association到盘子里)。如果您想记录每天供应的菜肴,这将是更好的选择,因为 dish/day 的每个组合都可以被唯一标识,并且可以包含一列用于计算使用次数。