Обновление всей строки (содержащей несколько столбцов) в созданной базе данных sqlite - PullRequest
0 голосов
/ 26 июня 2018

Я хочу создать функцию обновления , которая изменит записи столбцов ( вся строка ) в базе данных на основе INTEGER PRIMARY KEY из строка - если это вообще возможно.

У меня есть функция поиска, которая будет находить и загружать данные базы данных в поле EditText для редактирования / обновления.

Кнопка поиска (которая вызывает обработчик поиска) загружает содержимое в поля EditText, которые можно изменить / отредактировать, но при нажатии кнопки для обновления отредактированной записи вся база данных перезаписывается измененной записью EditText.

Просто чтобы уточнить, я хочу изменить одну строку, содержащую ПОРТ, ИМЯ и IP-адрес в базе данных, обновить эту единственную запись и поместить ее обратно в базу данных, не перезаписывая все записи в моей базе данных, как это происходит в настоящее время.

У меня нет возможности просмотреть базу данных в ее необработанном виде в папке data / data / {имя пакета} ..., поскольку я использую старый телефон Samsung (в котором нет файла database.db). по какой-то неизвестной причине - сообщение «Запустить как: Невозможно установить возможности ...») для отладки / запуска приложения и на моем компьютере недостаточно оперативной памяти для поддержки виртуального устройства.

Любая помощь, совет или примеры будут с благодарностью. Я очень новичок в разработке приложений для 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();
    }

    }

Функция find выглядит следующим образом:

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");
            }
        }
    });

Функция update выглядит следующим образом:

 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();
            }

        }
    });

1 Ответ

0 голосов
/ 26 июня 2018

Измените COL_ID + " = _id " на COLUMN_ID + " = ?" и измените аргумент null на массив со значением IP.

...