【问题标题】:updating rows instead of creating new entries database android更新行而不是创建新条目数据库android
【发布时间】:2014-05-18 13:44:31
【问题描述】:

我一直在研究 Android 食谱中的食谱,以利用数据库来存储事件。当前代码允许我添加新条目,但我无法修改任何添加的条目。我需要的是一个具有预定义行数(48)的数据库,具有通过相应的编辑文本字段更新这些行的功能。任何人都可以帮我修改以下代码来实现这一点吗?我是 android 编码的新手,我需要从这个数据库开始。

这是我的 MyDB 文件:

package com.cookbook.data;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.util.Log;

public class MyDB {
    private SQLiteDatabase db;
    private final Context context;
    private final MyDBhelper dbhelper;
    // Initializes MyDBHelper instance
    public MyDB(Context c){
        context = c;
        dbhelper = new MyDBhelper(context, Constants.DATABASE_NAME, null,
                                            Constants.DATABASE_VERSION);
    }
    // Closes the database connection
    public void close()
    {
        db.close();
    }
    // Initializes a SQLiteDatabase instance using MyDBhelper
    public void open() throws SQLiteException
    {
        try {
            db = dbhelper.getWritableDatabase();
        } catch(SQLiteException ex) {
            Log.v("Open database exception caught", ex.getMessage());
            db = dbhelper.getReadableDatabase();
        }
    }
    // Saves a diary entry to the database as name-value pairs in ContentValues instance
    // then passes the data to the SQLitedatabase instance to do an insert
    public long insertdiary(String title, String content)
    {
        try{
            ContentValues newTaskValue = new ContentValues();
            newTaskValue.put(Constants.TITLE_NAME,  title);
            newTaskValue.put(Constants.CONTENT_NAME, content);
            newTaskValue.put(Constants.DATE_NAME,     java.lang.System.currentTimeMillis());            
            return db.insert(Constants.TABLE_NAME,  null, newTaskValue);
        } catch(SQLiteException ex) {
            Log.v("Insert into database exception caught",
                    ex.getMessage());
            return -1;
        }
    }


    // Reads the diary entries from database, saves them in a Cursor class and returns     it from the method
    public Cursor getdiaries()
    {
        Cursor c = db.query(Constants.TABLE_NAME, null, null,
                            null, null, null, null);
        return c;
    }

}

这是我的 MyDBhelper 文件:

package com.cookbook.data;


import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;


public class MyDBhelper extends SQLiteOpenHelper{


    private static final String CREATE_TABLE="create table "+
    Constants.TABLE_NAME+" ("+
    Constants.KEY_ID+" integer primary key autoincrement, "+
    Constants.TITLE_NAME+" text not null, "+
    Constants.CONTENT_NAME+" text not null, "+
    Constants.DATE_NAME+" long);";
    // database initialization
    public MyDBhelper(Context context, String name, CursorFactory factory,
                        int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.v("MyDBhelper onCreate","Creating all the tables");
        try {
            db.execSQL(CREATE_TABLE);
        } catch(SQLiteException ex) {
            Log.v("Create table exception", ex.getMessage());
        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion,
                            int newVersion) {
        Log.w("TaskDBAdapter", "Upgrading from version "+oldVersion
                                +" to "+newVersion
                                +", which will destroy all     old data");
        db.execSQL("drop table if exists "+Constants.TABLE_NAME);
        onCreate(db);
    }




}

这是我的常量文件:

package com.cookbook.data;

public class Constants {
    public static final String DATABASE_NAME="datastorage";
    public static final int DATABASE_VERSION=1;
    public static final String TABLE_NAME="diaries";
    public static final String TITLE_NAME="title";
    public static final String CONTENT_NAME="content";
    public static final String DATE_NAME="recorddate";
    public static final String KEY_ID="_id";
    public static final String TABLE_ROW="row_id";
}

这是我在数据库中创建新条目的日记文件:

package com.example.classorganizer;

import android.app.Activity;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

import com.cookbook.data.MyDB;
import com.cookbook.data.MyDBhelper;
public class Diary extends Activity {
    EditText titleET1,contentET1;
    EditText titleET2,contentET2;
    Button submitBT;
    MyDB dba;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.diary);
        dba = new MyDB(this);
        dba.open();
        titleET1 = (EditText)findViewById(R.id.diary1);
        contentET1 = (EditText)findViewById(R.id.diarycontentText1);
        titleET2 = (EditText)findViewById(R.id.diary2);
        contentET2 = (EditText)findViewById(R.id.diarycontentText2);
        submitBT = (Button)findViewById(R.id.submitButton);
        submitBT.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                try {
                    saveItToDB();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }


        });
    }



    public void saveItToDB() {
        dba.insertdiary(titleET1.getText().toString(),     contentET1.getText().toString());
        dba.insertdiary(titleET2.getText().toString(),     contentET2.getText().toString());
        dba.close();
        titleET1.setText("");
        contentET1.setText("");
        titleET2.setText("");
        contentET2.setText("");
        Intent i = new Intent(Diary.this, DisplayDiaries.class);
        startActivity(i);
    }
    /** Called when the user clicks the Back button */
    public void visitMonday(View view) {
        Intent intent = new Intent(this, Monday.class);
        startActivity(intent);
    }
}

最后是我的 DisplayDiaries 文件,它在列表视图中返回创建的日记:

package com.example.classorganizer;


import java.util.Date;
import java.text.DateFormat;
import java.util.ArrayList;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import com.cookbook.data.Constants;
import com.cookbook.data.MyDB;




public class DisplayDiaries extends ListActivity {
    MyDB dba;
    DiaryAdapter myAdapter;
    private class MyDiary{
        public MyDiary(String t, String c, String r){
            title=t;
            content=c;
            recorddate=r;

        }
        public String title;
        public String content;
        public String recorddate;
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        dba = new MyDB(this);
        dba.open();
        setContentView(R.layout.diaries);

        super.onCreate(savedInstanceState);
        myAdapter = new DiaryAdapter(this);
        this.setListAdapter(myAdapter);
    }

    private class DiaryAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private ArrayList<MyDiary> diaries;
        public DiaryAdapter(Context context) {
            mInflater = LayoutInflater.from(context);
            diaries = new ArrayList<MyDiary>();
            getdata();
        }

        public void getdata(){
            Cursor c = dba.getdiaries();
            startManagingCursor(c);
            if(c.moveToFirst()){
                do{
                    String title =
                            c.getString(c.getColumnIndex(Constants.TITLE_NAME));
                    String content =
                            c.getString(c.getColumnIndex(Constants.CONTENT_NAME));
                    DateFormat dateFormat =
                            DateFormat.getDateTimeInstance();
                    String datedata = dateFormat.format(new
                            Date(c.getLong(c.getColumnIndex(
                                    Constants.DATE_NAME))).getTime());
                    MyDiary temp = new MyDiary(title,content,datedata);
                    diaries.add(temp);
                } while(c.moveToNext());
            }
        }

        @Override
        public int getCount() {return diaries.size();}
        public MyDiary getItem(int i) {return diaries.get(i);}
        public long getItemId(int i) {return i;}
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            final ViewHolder holder;
            View v = arg1;
            if ((v == null) || (v.getTag() == null)) {
                v = mInflater.inflate(R.layout.diaryrow, null);
                holder = new ViewHolder();
                holder.mTitle = (TextView)v.findViewById(R.id.name);
                holder.mDate = (TextView)v.findViewById(R.id.datetext);

                v.setTag(holder);
            } else {
                holder = (ViewHolder) v.getTag();
            }

            holder.mdiary = getItem(arg0);
            holder.mTitle.setText(holder.mdiary.title);
            holder.mDate.setText(holder.mdiary.recorddate);

            v.setTag(holder);

            return v;
        }

        public class ViewHolder {
            MyDiary mdiary;
            TextView mTitle;
            TextView mDate;

        }

    }
    /** Called when the user clicks the Back button */
    public void visitDiary(View view) {
        Intent intent = new Intent(this, Diary.class);
        startActivity(intent);
    }
}

正如我之前提到的,这段代码在运行时允许创建新日记并将它们放在列表视图中。我需要修改此代码,使数据库具有预定义的 48 行(默认为空内容),并且日记文件允许通过相应的 48 个编辑文本字段修改行。任何有关上述内容的帮助将不胜感激。我期待着向你学习。干杯,帕特里克

编辑---------------------------------------------- ------------------------------------------

由于我是一个绝对的初学者,我仍然无法在我的表中创建默认的 48 行,然后编写代码以使用相应的编辑文本更新每一行。也许有一些有用的灵魂可以为我解决这个问题?

编辑 2 --------------------------------------------- --------------------------------------------------

我已使用您的代码更新了 MyDBhelper onCreate 方法,如下所示:

@Override
    public void onCreate(SQLiteDatabase db) {
        Log.v("MyDBhelper onCreate","Creating all the tables");

        ContentValues cv=new ContentValues();
        cv.put(Constants.KEY_ID, 1);
        cv.put(Constants.TITLE_NAME,  "My App");
        db.insert( Constants.TABLE_NAME, null, cv);

        String Updatetable= "update" + Constants.TABLE_NAME + 
                "Set" + Constants.CONTENT_NAME + " = " + 1 + 
                "Where" +Constants.KEY_ID +" = " + R.id.diary1;

        try {
            db.execSQL(CREATE_TABLE);
        } catch(SQLiteException ex) {
            Log.v("Create table exception", ex.getMessage());
        }
    }

但是在 Diary 的 onCreate 中创建了一个新行而不是更新现有行...我在这里做错了什么?我相信我把代码放在了错误的地方,或者我错过了其他东西......

【问题讨论】:

  • 有插入语句,但是你在哪里写了更新来更新行?你还写了 48 个编辑文本字段,你在哪里声明的?
  • 这就是重点。我无法编写更新语句而不是这些插入语句。当涉及到 48 个编辑文本字段时,我还没有声明所有这些,因为我不知道如何编写第一部分...
  • 好的,然后告诉我一些事情...您如何插入 48 条记录以及要更新哪个字段?
  • 我不确定我是否理解您的问题,但就我而言,将有 48 个 EditText 允许更新现有行而不是两个插入新行的行。

标签: android mysql sql database row


【解决方案1】:

我把这个循环语句:

for(int i=1; i <= 48; i++) { insertdiary("", ""); } 

在我的 MyDBhelper 文件中的 onCreate() 方法中如下:

@Override
public void onCreate(SQLiteDatabase db) {
    Log.v("MyDBhelper onCreate","Creating all the tables");



    try {
        db.execSQL(CREATE_TABLE);


        for(int i=1; i <= 48; i++) { insertdiary("", ""); } 
    }

    catch(SQLiteException ex) {
        Log.v("Create table exception", ex.getMessage());

    }

}

没有创建新行,但无济于事。是因为数据库已经创建并且此代码在应用程序重新启动时没有运行吗?如果是这样,我该怎么做才能删除数据库并再次运行此代码?

编辑------------------------------ ------------------------------------------

我找到了解决方案: 更改方法签名以将 SQLiteDatabase 作为参数有效。

public long insertdiary(SQLiteDatabase db, String title, String content)

与:

for(int i=1; i <= 48; i++) { insertdiary(db, "free",""); }

放置在 MyDBhelper 文件的 onCreate() 方法中

解决了在创建数据库时创建行的问题。现在我需要找到一种方法来使用新创建的行中的数据填充edittext,以便让用户有机会保存或更改数据。 任何帮助,将不胜感激。

【讨论】:

  • 似乎每次我在日记文件中点击更新按钮时,都会连续创建 3 次新的 48 行。
  • *4 次。循环运行四次。每次更新行时,即 4x 48 个新创建的行。
  • 什么时候可以解除这个限制?
【解决方案2】:

这可能是有关如何更新数据库中的行的示例:

 public boolean updateDiaryEntry(String title,String content, long date, long rowId){
        ContentValues newValue = new ContentValues();
        newValue.put(Constants.TITLE_NAME, title);
        newValue.put(Constants.CONTENT_NAME, content);
        newValue.put(Constants.DATE_NAME, date);
        return db.update(DATABASE_TABLE, newValue, Constants.KEY_ID + "=" + rowId, null)>0;

    }

您应该将此代码放在您的 MyDB 文件中,并在您需要更新数据库中特定原始数据的值时使用它。

【讨论】:

  • 知道如何首先创建稍后更新的默认行吗?
  • 我在 MyDB 中尝试了您的解决方案,但 Eclipse 返回您的代码最后一行中的 mDb 无法解析。
  • 但是...我不知道在使用您的代码后我接下来应该做什么。我相信记录不会像那样开始保存到现有行中......
  • 如果您第一次创建数据库时有一个 for 循环,您可以在其中使用 insertDiary 方法在数据库中插入 48 个空原始数据。然后您可以使用 updateDiaryEntry 相应地更新每个原始数据。
  • 我会试试这个,让你知道它是怎么回事。谢谢纳蒂姆
【解决方案3】:

我不确定您如何处理 48 编辑文本,但下面的示例将让您了解如何编写更新查询。

String Updatetable= "update " + Constants.TABLE_NAME  + "Set " + Constants.CONTENT_NAME + " = " + your value + "Where " +Constants.KEY_ID +" = " + <<May be your edit text value>> +

将上述查询写入您要更新值的位置

编辑---------------------------------------------- --------------------------------------------------------------

首先你需要有关于这些行应该包含什么的数据,然后你有多种方法可以将数据插入数据中。

  1. 使用内容值

    ContentValues cv=new ContentValues(); cv.put(Constants.KEY_ID, 1); cv.put(Constants.TITLE_NAME, "My App"); db.insert( Constants.TABLE_NAME,null,cv);

  2. 如上所述编写查询(Update Query)并使用rawqueryexecsql中的任何一种方法

    db.rawQuery(&lt;&lt;your insert query&gt;&gt;,null)

同样execsql

要获取更多信息,请查看可用的 android 文档。 link

【讨论】:

  • 好的,但是如何在更新前创建前 48 行?
  • 创建表后立即在onCreate 中创建那些行,然后在您的应用程序中更新这些行
  • 我知道这听起来很愚蠢,但我应该如何声明这些行?
  • 感谢您的回答,但对我来说似乎太复杂了。我是一个绝对的初学者,不知道如何处理我食谱中的代码......
  • 在示例 1 中。我需要在 > 中输入什么?
猜你喜欢
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多