Java 在SQLite Android中保存元素
我想在anndroid应用程序中将Java 在SQLite Android中保存元素,java,android,database,sqlite,cursor,Java,Android,Database,Sqlite,Cursor,我想在anndroid应用程序中将DatabaseTableDay保存到我的SQLite中,但出现了一些问题 我的DatabaseDAODay是: public class DatabaseDAODay { public static final String TAG = "DaysDAO"; // Database fields private SQLiteDatabase mDatabase; private DatabaseHelper mDbHelpe
DatabaseTableDay
保存到我的SQLite中,但出现了一些问题
我的DatabaseDAODay
是:
public class DatabaseDAODay {
public static final String TAG = "DaysDAO";
// Database fields
private SQLiteDatabase mDatabase;
private DatabaseHelper mDbHelper;
private Context mContext;
private String[] mAllColumns = { DatabaseHelper.COLUMN_DAY_ID,
DatabaseHelper.COLUMN_DAY_NAME, DatabaseHelper.COLUMN_DAY_WEIGHT};
public DatabaseDAODay(Context context) {
this.mContext = context;
mDbHelper = new DatabaseHelper(context);
// open the database
try {
open();
} catch (SQLException e) {
Log.e(TAG, "SQLException on openning database " + e.getMessage());
e.printStackTrace();
}
}
public void open() throws SQLException {
mDatabase = mDbHelper.getWritableDatabase();
}
public void close() {
mDbHelper.close();
}
public DatabaseTableDay createDay(String name, float weight, Long id) {
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMN_DAY_NAME, name);
values.put(DatabaseHelper.COLUMN_DAY_WEIGHT, weight);
long insertId = id;
Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns,
DatabaseHelper.COLUMN_DAY_ID + " = " + insertId, null, null,
null, null);
DatabaseTableDay newDay = new DatabaseTableDay();
if(cursor != null && cursor.moveToFirst()){
newDay = cursorToDay(cursor);
cursor.close();
Toast.makeText(mContext,"im here",Toast.LENGTH_LONG).show();
}
return newDay;
}
public void deleteDay(DatabaseTableDay databaseTableDay) {
long id = databaseTableDay.getId();
// delete all employees of this company
DatabaseDAOActivity databaseDAOActivity = new DatabaseDAOActivity(mContext);
List<DatabaseTableActivity> databaseTableActivities = databaseDAOActivity.getActivitiesOfDay(id);
if (databaseTableActivities != null && !databaseTableActivities.isEmpty()) {
for (DatabaseTableActivity e : databaseTableActivities) {
databaseDAOActivity.deleteActivity(e);
}
}
System.out.println("the deleted day has the id: " + id);
mDatabase.delete(DatabaseHelper.TABLE_DAYS, DatabaseHelper.COLUMN_DAY_ID
+ " = " + id, null);
}
public List<DatabaseTableDay> getAllDays() {
List<DatabaseTableDay> listDays = new ArrayList<DatabaseTableDay>();
Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns,
null, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
DatabaseTableDay day = cursorToDay(cursor);
listDays.add(day);
cursor.moveToNext();
}
// make sure to close the cursor
cursor.close();
}
return listDays;
}
public DatabaseTableDay getDayById(long id) {
Cursor cursor = mDatabase.query(DatabaseHelper.TABLE_DAYS, mAllColumns,
DatabaseHelper.COLUMN_DAY_ID + " = ?",
new String[] { String.valueOf(id) }, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
DatabaseTableDay databaseTableDay = cursorToDay(cursor);
return databaseTableDay;
}
protected DatabaseTableDay cursorToDay(Cursor cursor) {
DatabaseTableDay databaseTableDay = new DatabaseTableDay();
databaseTableDay.setId(cursor.getLong(0));
databaseTableDay.setName(cursor.getString(1));
databaseTableDay.setWeight(cursor.getLong(2));
return databaseTableDay;
}
}
公共类数据库daoday{
公共静态最终字符串TAG=“DaysDAO”;
//数据库字段
私有SQLITE数据库mDatabase;
私有数据库助手mDbHelper;
私有上下文;
私有字符串[]mAllColumns={DatabaseHelper.COLUMN\u DAY\u ID,
DatabaseHelper.COLUMN\u DAY\u NAME,DatabaseHelper.COLUMN\u DAY\u WEIGHT};
公共数据库DAODAY(上下文){
this.mContext=上下文;
mDbHelper=新数据库助手(上下文);
//打开数据库
试一试{
open();
}捕获(SQLE异常){
Log.e(标记“打开数据库时的SQLException”+e.getMessage());
e、 printStackTrace();
}
}
public void open()引发SQLException{
mDatabase=mDbHelper.getWritableDatabase();
}
公众假期结束(){
mDbHelper.close();
}
公共数据库TableDay createDay(字符串名称、浮动权重、长id){
ContentValues=新的ContentValues();
value.put(DatabaseHelper.COLUMN\u DAY\u NAME,NAME);
value.put(DatabaseHelper.COLUMN\u DAY\u WEIGHT,WEIGHT);
长插入id=id;
Cursor Cursor=mDatabase.query(DatabaseHelper.TABLE_天、列、,
DatabaseHelper.COLUMN_DAY_ID+“=”+insertId,null,null,
空,空);
DatabaseTableDay newDay=新DatabaseTableDay();
if(cursor!=null&&cursor.moveToFirst()){
newDay=cursorToDay(游标);
cursor.close();
Toast.makeText(mContext,“我在这里”,Toast.LENGTH_LONG.show();
}
新年归来;
}
公共void deleteDay(DatabaseTableDay DatabaseTableDay){
long id=databaseTableDay.getId();
//删除此公司的所有员工
DatabaseDAOActivity DatabaseDAOActivity=新的DatabaseDAOActivity(mContext);
List databaseTableActivities=databaseDAOActivity.getActivitiesOfDay(id);
if(databaseTableActivities!=null&&!databaseTableActivities.isEmpty()){
for(DatabaseTableActivity e:databaseTableActivities){
databaseDAOActivity.deleteActivity(e);
}
}
System.out.println(“删除的日期的id为:+id”);
mDatabase.delete(DatabaseHelper.TABLE\u DAYS,DatabaseHelper.COLUMN\u DAY\u ID
+“=”+id,空);
}
公共列表getAllDays(){
List listDays=新建ArrayList();
Cursor Cursor=mDatabase.query(DatabaseHelper.TABLE_天、列、,
空,空,空,空,空,空);
如果(光标!=null){
cursor.moveToFirst();
而(!cursor.isAfterLast()){
DatabaseTableDay=cursorToDay(游标);
添加(天);
cursor.moveToNext();
}
//确保关闭光标
cursor.close();
}
返回列表天数;
}
公共数据库TableDay getDayById(长id){
Cursor Cursor=mDatabase.query(DatabaseHelper.TABLE_天、列、,
DatabaseHelper.COLUMN_DAY_ID+“=?”,
新字符串[]{String.valueOf(id)},null,null,null);
如果(光标!=null){
cursor.moveToFirst();
}
DatabaseTableDay DatabaseTableDay=游标今天(游标);
返回数据库tableday;
}
受保护的DatabaseTableDay游标今天(游标){
DatabaseTableDay DatabaseTableDay=新的DatabaseTableDay();
databaseTableDay.setId(cursor.getLong(0));
databaseTableDay.setName(cursor.getString(1));
databaseTableDay.setWeight(cursor.getLong(2));
返回数据库tableday;
}
}
我试图通过以下方式保存它:
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
DatabaseTableDay databaseTableDay = databaseDAODay.createDay(
editText.getText().toString(), 100f, new Long(myId));
List<DatabaseTableDay> list = databaseDAODay.getAllDays();
}
});
saveButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
DatabaseTableDay DatabaseTableDay=databaseDAODay.createDay(
editText.getText().toString(),100f,新长(myId));
List List=databaseDAODay.getAllDays();
}
});
但是列表
仍然是空的
问题可能是DatabaseDAODay
中的createDay()
方法,因为if条件始终为null,并且应用程序不运行cursorToDay()
方法
我的问题是无条件的,如果只有cursort.moveToFirst()
和cursorToDay()
就有NullPoinerException
,因为Cousor是空的。我遵循并放置了条件=空
但实际上什么也没发生,列表总是空的
我该如何解决我的问题?您的问题是正确的
createDay()
:您尝试使用query()从数据库中读取,而不是使用insert()
插入新的一天
按以下方式更改您的方法:
public DatabaseTableDay createDay(String name, float weight, Long id) {
DatabaseTableDay dayToReturn;
ContentValues values = new ContentValues();
values.put(DatabaseHelper.COLUMN_DAY_NAME, name);
values.put(DatabaseHelper.COLUMN_DAY_WEIGHT, weight);
values.put(DatabaseHelper.COLUMN_DAY_ID, id);
long resID = mDatabase.insert(DatabaseHelper.TABLE_DAYS, null, values);
if (resID == -1)
{
// something went wrong, do error handling here
dayToReturn = null;
}
else
{
// no error: resID is "the row ID of the newly inserted row"
// you only need this info if you are using autoincrement
// not if you set the ID yourself
// all right, this will work -
// but somehow it hurts a little to retrieve an entry I just added.
// I'd like much more to simply use a constructor with all the values
// and create a new DatabaseTableDay instance
dayToReturn = getDayById(id);
}
return dayToReturn;
}
另请参见此文档链接,以了解它的工作原理!然而,我还有一个问题,我从web下载了一些数据,并希望将它们放入SQLite。不实现多个表并使用Json值将所有内容放在一个表DatabaseTableDay
,这是一个非常糟糕的解决方案吗?我的意思是从object
而不是List odobject
@barmi使用带有Json的字符串,我很抱歉,但我对Json没有太多经验。话虽如此,也许你会在一端(插入数据)节省时间/编码/工作,而在另一端(检索信息)则会节省更多的时间/编码/工作。我认为你应该用一个小例子问一个新问题(也许也在CodeReview上),因为它是关于哪个设计更好,为什么更好。答案将在很大程度上取决于您希望从数据库中检索什么类型的信息。