অ্যান্ড্রয়েড রুমে সত্তার কিছু নির্দিষ্ট ক্ষেত্র আপডেট করুন


122

আমি আমার নতুন প্রকল্পের জন্য অ্যান্ড্রয়েড রুম অধ্যবসায় গ্রন্থাগার ব্যবহার করছি। আমি টেবিলের কিছু ক্ষেত্র আপডেট করতে চাই। আমি আমার মতো চেষ্টা করেছি Dao-

// Method 1:

@Dao
public interface TourDao {
    @Update
    int updateTour(Tour tour);
}

তবে আমি যখন এই পদ্ধতিটি ব্যবহার করে আপডেট করার চেষ্টা করি তখন এটি সত্তার প্রতিটি ক্ষেত্র আপডেট করে যেখানে এটি ট্যুর অবজেক্টের প্রাথমিক কী মানের সাথে মেলে। আমি ব্যবহার করেছি@Query

// Method 2:

@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);

এটি কাজ করছে তবে আমার ক্ষেত্রে অনেক প্রশ্ন থাকবে কারণ আমার সত্তায় আমার অনেক ক্ষেত্র রয়েছে। আমি জানতে চাই যে আমি Method 1কোথায় আইডি = 1 এর মতো কিছু ক্ষেত্র (সমস্ত নয়) আপডেট করতে পারি ; (আইডি হ'ল স্বয়ংক্রিয় উত্পাদিত প্রাথমিক কী)।

// Entity:

@Entity
public class Tour {
    @PrimaryKey(autoGenerate = true)
    public long id;
    private String startAddress;
    private String endAddress;
    //constructor, getter and setter
}

সারণিতে কীভাবে একটি তালিকা আপডেট করবেন। প্রকৃতপক্ষে আমি তালিকাটিতে সারণি দ্বারা টাইপকনভার্টারটি সন্নিবেশ করিয়েছি। তবে আপডেট নিয়ে আসার সময় এটি কাজ করছে না। আপনি যদি এইরকম কোনও সমস্যার মুখোমুখি হন তবে দয়া করে পরামর্শ দিন।
আমান গুপ্ত - ShOoTeR

@ আমানগুপ্ত-শোটিআর আপনি কি উপরের মন্তব্যের জন্য কোনও সমাধান পেয়েছেন?
স্কাইজেক

আমার লাইব্রেরি ক্রিপটন পার্সিস্টেন লাইব্রেরি সেই কক্ষ লাইব্রেরির সাথে বেশ একই রকম কাজ করে। ক্রিপটন ব্যবহার করে আমি কীভাবে এই সমস্যার সমাধান করি তা যদি আপনি দেখতে চান তবে দয়া করে abubusoft.com/wp/2019/10/02/…
এক্সেসকো

@ আমানগুপ্ত-শোআউটআর '@ কিউয়ারি' ব্যবহার করে আপডেটে আমি এ জাতীয় সমস্যার মুখোমুখি হয়েছি। তারপরে আমি আপডেটের পরিবর্তে একই প্রাথমিক কী মান সহ একটি অবজেক্ট তৈরি করে '@Insert (onConflict = OnConflictStrategy.REPLACE)' ব্যবহার করেছি এবং এটি কাজ করেছে
রাসেল

উত্তর:


68

আমি জানতে চাই যে আমি পদ্ধতি 1 যেখানে আইডি = 1 এর মতো কিছু ক্ষেত্র (সমস্ত নয়) আপডেট করতে পারি

@Queryপদ্ধতি 2 তে আপনি যেমন ব্যবহার করেছেন তেমন ব্যবহার করুন ।

আমার ক্ষেত্রে অনেক দীর্ঘ প্রশ্ন কারণ আমার সত্তায় আমার অনেক ক্ষেত্র রয়েছে

তারপরে আরও ছোট সত্ত্বা রয়েছে। অথবা, পৃথকভাবে ক্ষেত্রগুলি আপডেট করবেন না, তবে এর পরিবর্তে ডেটাবেসগুলির সাথে আরও মোটা-দানাযুক্ত মিথস্ক্রিয়া রয়েছে।

IOW, ঘরে নিজেই এমন কিছু নেই যা আপনি যা চান তা করবে।


কোনও পরামিতি ছাড়াই টেবিলটি আপডেট করা সম্ভব? আমার অর্থ বুুলিয়ান মান অদলবদল।
বিষ্ণু টিবি

1
@ বিষ্ণুটিবি: আপনি যদি একটি এসকিউএল বিবৃতি তৈরি করতে পারেন যা আপনার যা চান তা করে, আপনার এটি ব্যবহার করতে সক্ষম হওয়া উচিত @Query
কমন্সওয়্যার

@ কমন্সওয়্যার এটি পেয়েছে আমি বুলিয়ান আসল মান সহ সারিগুলির একটি সেট আনতে চেয়েছিলাম। তবে রুম খিলান আমাকে পরামিতি হিসাবে সত্য / মিথ্যা পাস করতে দেয় নি। পরিবর্তে true =1,false=0 SELECT * FROM note_table WHERE isNoteArchived == 0
বিষ্ণু টিবি

4
কক্ষ ২.২.০-আলফা01 ( বিকাশকারী.অ্যান্ড্রয়েড / জেটপ্যাক / অ্যান্ড্রয়েডেক্স / রিলিজস/… ) @Update এর জন্য একটি নতুন প্যারামিটার প্রবর্তন করেছে যা আপনাকে লক্ষ্য সত্ত্বা সেট করতে দেয়। এটি আংশিক আপডেটগুলি সম্ভব করে তোলে।
জোনাস

84

SQLite আপডেট ডক্স অনুসারে :

<!-- language: lang-java -->
@Query("UPDATE tableName SET 
    field1 = :value1,
    field2 = :value2, 
    ...
    //some more fields to update
    ...
    field_N= :value_N
    WHERE id = :id)

int updateTour(long id, 
               Type value1, 
               Type value2, 
               ... ,
               // some more values here
               ... ,
               Type value_N);

উদাহরণ:

সত্তা:

@Entity(tableName = "orders")
public class Order {

@NonNull
@PrimaryKey
@ColumnInfo(name = "order_id")
private int id;

@ColumnInfo(name = "order_title")
private String title;

@ColumnInfo(name = "order_amount")
private Float amount;

@ColumnInfo(name = "order_price")
private Float price;

@ColumnInfo(name = "order_desc")
private String description;

// ... methods, getters, setters
}

দাও:

@Dao
public interface OrderDao {

@Query("SELECT * FROM orders")
List<Order> getOrderList();

@Query("SELECT * FROM orders")
LiveData<List<Order>> getOrderLiveList();

@Query("SELECT * FROM orders WHERE order_id =:orderId")
LiveData<Order> getLiveOrderById(int orderId);

/**
* Updating only price
* By order id
*/
@Query("UPDATE orders SET order_price=:price WHERE order_id = :id")
void update(Float price, int id);

/**
* Updating only amount and price
* By order id
*/
@Query("UPDATE orders SET order_amount = :amount, price = :price WHERE order_id =:id")
void update(Float amount, Float price, int id);

/**
* Updating only title and description
* By order id
*/
@Query("UPDATE orders SET order_desc = :description, order_title= :title WHERE order_id =:id")
void update(String description, String title, int id);

@Update
void update(Order order);

@Delete
void delete(Order order);

@Insert(onConflict = REPLACE)
void insert(Order order);
}

4
আপনি এই আরও ব্যাখ্যা করতে পারেন?
মাইকেল

1
প্রশ্ন থেকে সত্তার সাথে ডিএও পদ্ধতিটি দেখতে পাবেন: @ কিউরি ("আপডেটের ট্যুর সেট এন্ড অ্যাড্রেস =: এন্ড_ড্রেস, স্টার্টএড্রেস =: স্টার্ট_এড্রেস যেখানে আইডি =: টিড) ইনটি আপডেটটোর (লম্বা জোয়ার, স্ট্রিং এন্ড অ্যাড্রেস, স্ট্রিং স্টার্ট_এড্রেস);
জুরিজ পিতুলজা

1
আমি আপনার সমাধানটি বোঝাতে চেয়েছিলাম :) অন্য ব্যবহারকারীদের এটি দেখার পক্ষে এটি এখানে থাকা ভাল
মাইকেল মাইকেল

ওহ, আমি ভেবেছিলাম এটি সুস্পষ্ট। এখনই স্থির।
জুরিজ পিতুলজা 21 '11

14

অক্টোবর 2019 এ প্রকাশিত রুম 2.2.0 হিসাবে , আপনি আপডেটের জন্য একটি লক্ষ্য সত্ত্বা নির্দিষ্ট করতে পারেন। তারপরে যদি আপডেটের প্যারামিটারটি আলাদা হয় তবে রুম কেবলমাত্র আংশিক সত্তা কলামগুলি আপডেট করবে। ওপি প্রশ্নের একটি উদাহরণ এটি আরও কিছুটা স্পষ্টভাবে দেখায়।

@Update(entity = Tour::class)
fun update(obj: TourUpdate)

@Entity
public class TourUpdate {
    @ColumnInfo(name = "id")
    public long id;
    @ColumnInfo(name = "endAddress")
    private String endAddress;
}

খেয়াল করুন আপনার প্রশ্নে আপনার আসল ট্যুর সত্তা সহ ট্যুরআপডেট নামে একটি নতুন আংশিক সত্তা তৈরি করতে হবে। এখন আপনি যখন ট্যুর আপডেট অবজেক্টের সাথে আপডেট কল করবেন তখন এটি এন্ড অ্যাড্রেস আপডেট করবে এবং স্টার্টএড্রেস মানটি একইভাবে ছেড়ে যাবে। এটি আমার ডিএওতে আমার একটি ইনসার্টআরআপডেট পদ্ধতির ব্যবহারের জন্য উপযুক্ত যা এপিআই থেকে নতুন রিমোট মান সহ ডিবি আপডেট করে তবে স্থানীয় অ্যাপ্লিকেশন ডেটাটি কেবল টেবিলে রেখে দেয়।


6

আপনি এটি চেষ্টা করতে পারেন, তবে পারফরম্যান্সটি আরও খারাপ হতে পারে:

@Dao
public abstract class TourDao {

    @Query("SELECT * FROM Tour WHERE id == :id")
    public abstract Tour getTour(int id);

    @Update
    public abstract int updateTour(Tour tour);

    public void updateTour(int id, String end_address) {
        Tour tour = getTour(id);
        tour.end_address = end_address;
        updateTour(tour);
    }
}

2

আমি মনে করি আপনার কেবলমাত্র নির্দিষ্ট কিছু ক্ষেত্র আপডেট করার দরকার নেই। কেবল পুরো ডেটা আপডেট করুন।

@ আপডেটের ক্যোয়ারী

এটি মূলত একটি প্রদত্ত কোয়েরি। কিছু নতুন কোয়েরি করার দরকার নেই।

@Dao
interface MemoDao {

    @Insert
    suspend fun insert(memo: Memo)

    @Delete
    suspend fun delete(memo: Memo)

    @Update
    suspend fun update(memo: Memo)
}

Memo.class

@Entity
data class Memo (
    @PrimaryKey(autoGenerate = true) val id: Int,
    @ColumnInfo(name = "title") val title: String?,
    @ColumnInfo(name = "content") val content: String?,
    @ColumnInfo(name = "photo") val photo: List<ByteArray>?
)

আপনার কেবলমাত্র আইডিটি জানা দরকার। উদাহরণস্বরূপ, আপনি যদি কেবল 'শিরোনাম' আপডেট করতে চান তবে ইতিমধ্যে inোকানো ডেটা থেকে আপনি 'সামগ্রী' এবং 'ফটো' পুনরায় ব্যবহার করতে পারেন বাস্তব কোডে, এই জাতীয় ব্যবহার করুন

val memo = Memo(id, title, content, byteArrayList)
memoViewModel.update(memo)

-3

আপনার যদি কোনও নির্দিষ্ট ব্যবহারকারী আইডি "এক্স" এর জন্য ব্যবহারকারীর তথ্য আপডেট করতে হয়,

  1. আপনাকে এমন একটি ডিবিম্যানেজার ক্লাস তৈরি করতে হবে যা এটির নির্মাণকারীর ডাটাবেসকে সূচনা করবে এবং আপনার ভিউমোডেল এবং ডিএওর মধ্যে একটি মধ্যস্থতা হিসাবে কাজ করবে এবং এছাড়াও।
  2. ViewModel ডেটাবেস অ্যাক্সেস করতে dbManager একটি দৃষ্টান্ত আরম্ভ হবে। কোডটি দেখতে এমন হওয়া উচিত:

       @Entity
        class User{
        @PrimaryKey
        String userId;
        String username;
        }
    
        Interface UserDao{
        //forUpdate
        @Update
        void updateUser(User user)
        }
    
        Class DbManager{
        //AppDatabase gets the static object o roomDatabase.
        AppDatabase appDatabase;
        UserDao userDao;
        public DbManager(Application application ){
        appDatabase = AppDatabase.getInstance(application);
    
        //getUserDao is and abstract method of type UserDao declared in AppDatabase //class
        userDao = appDatabase.getUserDao();
        } 
    
        public void updateUser(User user, boolean isUpdate){
        new InsertUpdateUserAsyncTask(userDao,isUpdate).execute(user);
        }
    
    
    
        public static class InsertUpdateUserAsyncTask extends AsyncTask<User, Void, Void> {
    
    
         private UserDao userDAO;
         private boolean isInsert;
    
         public InsertUpdateBrandAsyncTask(BrandDAO userDAO, boolean isInsert) {
           this. userDAO = userDAO;
           this.isInsert = isInsert;
         }
    
         @Override
         protected Void doInBackground(User... users) {
           if (isInsert)
        userDAO.insertBrand(brandEntities[0]);
           else
        //for update
        userDAO.updateBrand(users[0]);
        //try {
        //  Thread.sleep(1000);
        //} catch (InterruptedException e) {
        //  e.printStackTrace();
        //}
           return null;
         }
          }
        }
    
         Class UserViewModel{
         DbManager dbManager;
         public UserViewModel(Application application){
         dbmanager = new DbMnager(application);
         }
    
         public void updateUser(User user, boolean isUpdate){
         dbmanager.updateUser(user,isUpdate);
         }
    
         }
    
    
    
    
    Now in your activity or fragment initialise your UserViewModel like this:
    
    UserViewModel userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);

    তারপরে এইমাত্র আপনার ব্যবহারকারীর আইটেমটি আপডেট করুন, মনে করুন আপনার ইউজারআইডি 1122 এবং ব্যবহারকারী নামটি "xyz" যা "জাইএক্স" এ পরিবর্তন করতে হবে।

    আইডি 1122 ব্যবহারকারীর অবজেক্টের একটি আইটেম পান

User user = new user();
 if(user.getUserId() == 1122){
   user.setuserName("zyx");
   userViewModel.updateUser(user);
 }

এটি একটি কাঁচা কোড, আশা করি এটি আপনাকে সহায়তা করবে।

শুভ কোডিং


10
আপনি সত্যই একটি ভিউমডেলে ডাটাবেস ক্রিয়া করেন ???
গড নো প্লিজ ন

@ এমসিফ্লাই, ভিউ মডেলে ডাটাবেস অপারেশন করা কেন খারাপ বিবেচিত হয়?
ড্যানিয়েল

একক দায়িত্বের নীতিটি হ'ল
এমসিফ্লাই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.