【问题标题】:Updating an entire row (containing multiple columns) within a sqlite database created在创建的 sqlite 数据库中更新整行(包含多列)
【发布时间】:2018-06-26 14:13:31
【问题描述】:

我想创建一个更新函数,它将根据INTEGER PRIMARY KEY更改数据库中列(整行)的条目strong> 行 - 如果可能的话。

我有一个查找功能,它将查找数据库的详细信息并将其加载到 EditText 字段中以进行编辑/更新。

查找按钮(调用查找处理程序)将内容加载到可以更改/编辑的 EditText 字段中,但是当按下按钮更新已编辑条目时,整个数据库将被更改后的 EditText 条目覆盖。

澄清一下,我想更改数据库中包含 PORT、NAME 和 IP 地址的单行,更新该单个条目并将其放回数据库中,而不会覆盖我所有的数据库条目——就像目前正在发生的那样。

我无法在 data/data/{package name}... 文件夹中看到未经编辑的原始数据库,因为我使用的是旧三星手机(不包含 database.db由于某些未知原因 - 说明“运行方式:无法设置功能...”消息)用于调试/运行应用程序和我使用的 PC 没有足够的 RAM 来支持虚拟设备。

任何帮助、建议或示例将不胜感激。我对 Android 应用开发和 Java 非常陌生,所以如果问题很明显或微不足道,请见谅。

表是这样创建的

 public static final String TABLE_USER = "User";
 public static final String COL_ID = "_id";
 public static final String COLUMN_ID = "UserIP";
 public static final String COLUMN_NAME = "UserName";
 public static final String COLUMN_PORT = "UserPort";

    public void onCreate(SQLiteDatabase db)
     {
            String CREATE_USER_TABLE = "CREATE TABLE IF NOT EXISTS " +
            TABLE_USER + "(" + COL_ID + " INTEGER PRIMARY KEY, " + 
                           COLUMN_PORT + " INTEGER, " + COLUMN_NAME
            + " TEXT, " + COLUMN_ID + " TEXT " + ")";

    try
    {
        db.execSQL(CREATE_USER_TABLE);

    }catch (SQLException e)
    {
      e.printStackTrace();
    }

    }

查找功能如下:

public User findHandler(String username, String IP)
{
    String query = "Select * FROM " + TABLE_USER + " WHERE " +
            COLUMN_NAME + " = '" + username + "'" + " and " + COLUMN_ID + " = 
          '" +  String.valueOf(IP) + "'";

    SQLiteDatabase db = this.getWritableDatabase();

    Cursor cursor = db.rawQuery(query, null);

    User user = new User();

    if (cursor.moveToFirst())
    {
        cursor.moveToFirst();

        user.setUserPort(Integer.parseInt(cursor.getString(1)));

        user.setUserName(cursor.getString(2));

        user.setID(cursor.getString(3));

        cursor.close();

       //Log.d("Message1", msg);

    }

    else
    {
        user = null;
    }

    db.close();

    return user;
}

在MainActivity中find按钮按下(onClick)如下:

 btnfind.setOnClickListener(new View.OnClickListener()
    {
        public void onClick(View view)
        {
            MyDBHandler dbHandler = new MyDBHandler(getApplicationContext());

            User user = dbHandler.findHandler(username.getText().toString(), 
              userid.getText().toString());


            if (user != null)
            {
                lst.setText(user.getID() + " " + user.getUserName()
                        + " " + String.valueOf(user.getUserPort()));

                //found_id =(user.getWhere());

    // Load into the EditText for editing

                userid.setText(user.getID());                            
                username.setText(user.getUserName());                    
                userport.setText(String.valueOf(user.getUserPort()));    
            }

            else
            {
                 lst.setText("No User Found");
            }
        }
    });

更新功能如下:

 public boolean updateHandler(int Port, String username, String IP)
{
    SQLiteDatabase db = this.getWritableDatabase();


    ContentValues args = new ContentValues();

    args.put(COLUMN_ID, IP);
    args.put(COLUMN_NAME, username);
    args.put(COLUMN_PORT, Port);


    return db.update(TABLE_USER, args, COL_ID + " = _id " , null) >0;

}

在MainActivity中update按钮按下(onClick)如下:

       btnupdate.setOnClickListener(new View.OnClickListener()
       {
          public void onClick(View view)
          {
             MyDBHandler dbHandler = new             
              MyDBHandler(getApplicationContext());

            if (userport.length() >= 1 && userid.length() >= 1 && 
                                  username.length() >= 1)
            {
                userid.getText();
                username.getText();
                userport.getText();

            boolean result = 

     dbHandler.updateHandler(Integer.parseInt(userport.getText().toString()), 
                 username.getText().toString(), userid.getText().toString());

                if (result)
                {

     dbHandler.updateHandler(Integer.parseInt(userport.getText().toString()), 
                 username.getText().toString(), userid.getText().toString());

                    lst.setText("Record Updated.");

                }else
                {
                    lst.setText("No Match.");
                }

            }else
            {
                Toast.makeText(MainActivity.this, "Please enter a valid 
                                     user." , Toast.LENGTH_LONG).show();
            }

        }
    });

【问题讨论】:

  • 运行代码时会发生什么?你想发生什么不同的事情?您应该阅读ericlippert.com/2014/03/05/how-to-debug-small-programs,了解有关如何调试代码的一些提示。
  • 我希望将单行条目替换为在 EditText 字段中输入的内容。因此,将从数据库中已经存在的数据库条目中找到包含名称、端口和 IP 地址的单个条目。然后,我想只编辑该单个条目并使用新名称、端口和 IP 地址而不是所有条目来更新/更改该单行条目 - 就像目前正在发生的那样。

标签: java android android-sqlite database-management


【解决方案1】:

COL_ID + " = _id " 更改为COLUMN_ID + " = ?",并将null 参数更改为值为IP 的数组。

【讨论】:

  • 你的意思是这样的吗? return db.update(TABLE_USER, args, COLUMN_ID + " = ?", new String[] { user.getID()}) >0;
  • 我通过从每一行中提取主键整数并将其用作更新函数的检查子句来使其工作。感谢您的帮助@Code-Apprentice。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2013-04-30
相关资源
最近更新 更多