ঘর দৃistence়তা lib এর স্বতঃআগ্রহ হিসাবে প্রাথমিক কী কীভাবে তৈরি করা যায়


194

আমি একটি foodIdসত্ত্বা (রুম পার্সেন্টিশন লাইব ) ক্লাস ফুড তৈরি করছি, যেখানে আমি স্বায়ত্তশাসন হিসাবে তৈরি করতে চাই ।

@Entity
class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double)
{
    @PrimaryKey
    var foodId: Int = 0
    var calories: Double = 0.toDouble()
}

আমি কীভাবে foodIdএকটি স্বতঃসংশোধনের ক্ষেত্র সেট করতে পারি ?


4
পরিবর্তে 0.toDouble()আপনি 0.0এটি ডাবল হিসাবে ঘোষণা করতে ব্যবহার করতে পারেন
রবকো

2
আপনি কীভাবে খাদ্য শ্রেণীর একটি নতুন উদাহরণ তৈরি করবেন? আপনি ম্যানুয়ালি আইডি নির্দিষ্ট করে থাকেন বা এটিকে ফাঁকা রেখে দেন?
Zookey

2
ভবিষ্যতের পাঠকদের জন্য একটি নোট - সেটটিকে আনসেট হিসাবে গণ্য করার জন্য প্রাথমিক কীটি অবশ্যই 0 টির জন্য হবে। আপনি যদি অন্য কোনও ডিফল্ট মান (উদাহরণস্বরূপ -1) ব্যবহার করেন, ঘর আইডিটি স্বয়ংক্রিয়ভাবে তৈরি করবে না।
মার্টিন মেলকা

উত্তর:


373

আপনার autoGenerateসম্পত্তিটি ব্যবহার করা দরকার

আপনার প্রাথমিক কী টীকাটি এমন হওয়া উচিত:

@PrimaryKey(autoGenerate = true)

প্রাথমিককির জন্য রেফারেন্স ।


3
ধন্যবাদ, আমি অটোআইক্রিমেন্টের জন্য অনুসন্ধান করছিলাম, কেন এটি সন্ধান করতে পারিনি।
chandil03

আরে @ ম্যাটপ্যাগ যদি আমি একটি টেবিলের দুটি প্রাথমিক কী (সম্মিলিত প্রাথমিক কী) এবং প্রাথমিক কীগুলির একটিতে স্বয়ংক্রিয় বর্ধিত হওয়া চাই? আমি কীভাবে এটি অর্জন করতে পারি? আপনি কি এখানে উত্তর দিতে পারেন ?
প্রিয়াঙ্কা আলাচিয়া

1
@ ম্যাটপেইগের ক্ষেত্রে যদি আমি একটি প্রাইমারী কে নিজে তৈরি করতে চাই এবং আরআরএসটি থেকে আসে তবে @Entity( primaryKeys = arrayOf(COLUMN_ID_LOCAL,COLUMN_ID_REMOTE))কী হবে?
15

@ মুর্ট আপনার একটি সমন্বিত প্রাথমিক কী প্রয়োজন, তবে আপনি যা অর্জন করতে চান তা করতে পারবেন না। এখানে
ম্যাটপ্যাগ

লিঙ্কযুক্ত ডকুমেন্টেশনের গুরুত্বপূর্ণ অংশ:Insert methods treat 0 as not-set while inserting the item.
মিশা

123

আপনি এটি যোগ করতে পারেন @PrimaryKey(autoGenerate = true):

@Entity
data class Food(
        var foodName: String, 
        var foodDesc: String, 
        var protein: Double, 
        var carbs: Double, 
        var fat: Double
){
    @PrimaryKey(autoGenerate = true)
    var foodId: Int = 0 // or foodId: Int? = null
    var calories: Double = 0.toDouble()
}

34
foodIdনাল হওয়ার দরকার নেই (তবে এটি হতে পারে)। একটি ডিফল্ট মান যেমন ব্যবহার করতে পারে। var foodId: Int = 0এবং স্বয়ংক্রিয়ভাবে সঠিকভাবে কাজ করবে।
মিচা বারান

8
@ মাইভাবারান, জাভা ডক থেকে, যখন টাইপটি আদিম জাভা হয় intবা long0 টি নাল-সক্ষম হিসাবে বিবেচনা করা হয়, যখন টাইপটি পূর্ণসংখ্যা বা লম্বা হয়, নালটি শূন্য হয়। যেহেতু কোটলিন ইন্ট যখন জেভিএম-এ আধ্যাত্মিক প্রাথমিক হিসাবে কাজ করে না, তখন আপনি ঠিক থাকেন এবং var foodId: Int = 0কাজ var foodId: Int? = 0করবেন তবে ইন্টের পরে থেকে কাজ করবেন না? পূর্ণসংখ্যা হিসাবে JVM এ রূপান্তরিত হয়। @ জেএমকে, আপনি যদি এটি 0 করেন intতবে উপরোক্ত কারণের জন্য আপনাকে অ-অযোগ্য করতে হবে ।
অ্যালান ভেলোসো

2
আপনি অন্য val jack = User(name = "Jack", phone= 1)
কোনওভাবে

1
এই পদ্ধতির সাথে আমি যে সমস্যাটি দেখছি তা হ'ল এটি একটি ডেটা ক্লাস। যখন খাদ্য একটি ডেটা ক্লাস হয় (স্নিপেটের মতো), তখন খাবার সমান () তুলনা করার জন্য ব্যবহৃত হয়, তাই ভিন্ন ভিন্ন খাবারের দুটি খাবার সমান হিসাবে বিবেচনা করা যেতে পারে। ডিফল্ট মান সহ নামযুক্ত যুক্তি ব্যবহার করা সমস্যার সমাধান করবে।
সট্টি

1
@ অ্যালানভেলোসো আপনি কি ব্যাখ্যা করতে পারেন যে কেন foodIdদেহটি কনস্ট্রাক্টরে না রেখে দেওয়া হয়েছিল?
নীরজ শেওয়ানি

42

যোগ @PrimaryKey(autoGenerate = true)

@Entity
public class User {

    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "full_name")
    private String name;

    @ColumnInfo(name = "phone")
    private String phone;

    public User(){
    }

    //type-1
    public User(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    //type-2
    public User(int id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

}

তথ্য সংরক্ষণ করার সময়

 //type-1
 db.userDao().InsertAll(new User(sName,sPhone)); 

 //type-2
 db.userDao().InsertAll(new User(0,sName,sPhone)); 

ধরন 1

আপনি যদি প্রাথমিক কীটির মান পাস না করে থাকেন তবে ডিফল্টরূপে এটি 0 বা নাল হবে।

টাইপ-2

অবজেক্ট তৈরি করার সময় আইডিটির জন্য নাল বা শূন্য রাখুন (আমার ক্ষেত্রে ব্যবহারকারী অবজেক্ট)

যদি ক্ষেত্রের প্রকারটি দীর্ঘ বা অন্তর্নির্মিত হয় (বা এর টাইপকোনভার্টার এটিকে দীর্ঘ বা আন্তঃতে রূপান্তর করে), সন্নিবেশ পদ্ধতিগুলি আইটেমটি সন্নিবেশ করার সময় 0 টি সেট না হিসাবে গণ্য করে।

যদি ক্ষেত্রের ধরণটি ইন্টিজার বা লং (অবজেক্ট) হয় (বা এর টাইপকোনভার্টর এটি একটি পূর্ণসংখ্যার বা দীর্ঘতে রূপান্তর করে), সন্নিবেশ পদ্ধতিগুলি আইটেমটি সন্নিবেশ করার সময় নালকে সেট না হিসাবে বিবেচনা করে।


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

2
@ ইগোর গণপলস্কি হ্যাঁ, তবে এন্ট্রি সেই কাস্টম আইডি দিয়ে জেনারেট করবে [অটো-ইনক্রিমেন্ট কাজ করবে না] এবং আপনি যদি আবার একই আইডি পাস করেন তবে এটি ব্যতিক্রমী 'অনন্য বাধা ব্যর্থ' ছুঁড়ে দেবে তাই আপনাকে সর্বদা নতুন আইডি পাস করতে হবে বা এটি তৈরি করতে হবে [0 বা নাল] এবং স্বতঃবৃদ্ধি আপনার জন্য এই কাজটি করতে দিন।
কুনাল খেদকার

3
আপনি যদি স্বয়ংক্রিয়ভাবে তৈরি করতে চান তবে আপনি কেন ব্যবহারকারীকে কনস্ট্রাক্টরে আইডি রাখতে দিচ্ছেন?
হেলকাস্ট

কোটলিনে আপনি ডেটা ক্লাস ব্যবহার করতে পারেন এবং লিখতে পারেন: val jack = User(name = "Jack", phone= 1)এই ক্ষেত্রে আপনি 0 টি কনস্ট্রাক্টর থেকে মুছে ফেলতে পারবেন
user7856586

@ হেলকাস্ট যদি আপনি ডিডিটি কনস্ট্রাক্টারে অন্তর্ভুক্ত না করেন (যেমন আমি কেবল হার্ড পথটি শিখেছি) আপনি যখন ডিবিকে জিজ্ঞাসা করেন তখন এটি আইডি ক্ষেত্রটি বরাদ্দ করবে না (এটি নির্মাণকারীর সাথে আপনি যা যা শুরু করবেন ঠিক তাই হবে) আমি ধরে নিই যে বস্তুর ক্ষেত্রগুলি পপুলেশন করার সময় এটি একই নির্মাণকারীকে কল করে।
আলী হিরানী

6
@Entity(tableName = "user")
data class User(

@PrimaryKey(autoGenerate = true)  var id: Int?,
       var name: String,
       var dob: String,
       var address: String,
       var gender: String
)
{
    constructor():this(null,
        "","","","")
}

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

4
সেখানে "ব্যবহার মত অনেক উত্তর @PrimaryKey(autoGenerate = true)" - আপনার উত্তরটি যোগ করুন কিছু এই থ্রেড নতুন করে?
বারবসান

হ্যাঁ এটি যোগ করেছে - এটি উপস্থাপন করে যে কীভাবে
শল্যচিকিত্সা

5

উদাহরণস্বরূপ, usersক্ষেত্রগুলি সহ আপনি যদি কোনও সত্তা সঞ্চয় (firstname, lastname , email)করতে চান এবং আপনি স্বয়ংক্রিয় জেনারেটেড আইডি চান, আপনি এটি করুন।

@Entity(tableName = "users")
data class Users(
   @PrimaryKey(autoGenerate = true)
   val id: Long,
   val firstname: String,
   val lastname: String,
   val email: String
)

কক্ষটি তারপরে idক্ষেত্রটি স্বয়ংক্রিয়ভাবে উত্পন্ন করবে এবং স্বয়ংক্রিয়ভাবে বৃদ্ধি পাবে ।


21
প্রতিবার আমরা যখন নতুন ব্যবহারকারী অবজেক্ট তৈরি করি তখন আমাদের একটি আইডি ক্ষেত্রটি পাস করতে হবে। এড়ানো যায়?
আদিত্য লাডওয়া

10
হ্যাঁ, @PrimaryKey(autoGenerated = true) val id: Long? = nullক্লাসের শরীরে কনস্ট্রাক্টরের বাইরে রাখুন
অ্যালান ভেলোসো

1
@ ম্যাগরিট কেয়ার আরও প্লিজ বিস্তৃত করার জন্য?
ইস্পাম

2
@ এসপাম আমার উত্তরের উত্তরটিতে আমি পোস্ট করেছি যাতে সম্পূর্ণ শ্রেণীর চেহারা কেমন হবে।
অ্যালান ভেলোসো

2
আসলে, আপনি কেবল আইডি হিসাবে 0 রাখতে পারেন। আপনি @ প্রিমিয়ারিকে বিকল্পটি সেট করে রাখলে ঘর স্বয়ংক্রিয়ভাবে একটি আইডি উত্পন্ন করবে।
রোমানেসো

1

উপরের কোড সহ আপনার সত্তা শ্রেণি টিকে দিন।

জাভাতে

@PrimaryKey(autoGenerate = true)
private int id;

কোটলিনে

@PrimaryKey(autoGenerate = true)
var id: Int;

এর পরে রুমটি স্বয়ংক্রিয়ভাবে উত্পন্ন হবে এবং আইডি ক্ষেত্রটি স্বয়ংক্রিয়ভাবে বৃদ্ধি করবে।

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