SQL ডাটাবেজের অন্যতম প্রধান নীতি হচ্ছে স্কিমা: কীভাবে ডাটাবেজ বিন্যাস্ত হবে তার একটা আনুষ্ঠানিক ঘোষণা। স্কিমা SQL স্টেটমেন্টে প্রতিফলন হয় যা আপনি আপনার ডাটাবেজ তৈরীতে ব্যবহার করেন। আপনি দেখবেন যে একটা সঙ্গি ক্লাস তৈরীতে এটা সাহাজ্য করে, যা কনট্রাক্ট ক্লাস হিসাবে পরিচিত, যা স্পষ্টভাবে সিস্টেমেটিক এবং সেল্ফ-ডকুমেন্টিং উপায়ে আপনার স্কিমার লেআউট সুনির্দিষ্ট করে।
একটি কনট্রাক্ট ক্লাস কনসটেন্ট এর জন্য কনটেইনার যা URLs, টেবল এবং কলাম এর জন্য নাম নির্ধারণ করে। কনট্রাক্ট ক্লাস আপনার একই প্যাকেজের মধ্যে অন্য সকল ক্লাসে একই কনসটেন্ট ব্যবহার করাটাকে অনুমোদন করে। এটা আপনাকে একটা স্থানে কলাম নাম পরিবর্তন করতে দেয় এবং আপনার কোডের সর্বত্র সঞ্চারিত হতে দেয়।
একটি কনট্রাক্ট ক্লাস বিন্যাস করতে ভালো উপায় হচ্ছে সংজ্ঞা আরোপ করা যা ক্লাসের রুট লেভেলে সম্পূর্ণ ডাটাবেজে বৈশ্বিক হয়। তারপর প্রতিটা টেবলের জন্য একটা ইনার ক্লাস তৈরী করুন যা এর কলামকে গণনা করে।
নোট: BaseColumns ইন্টারফেসটি বাস্তবায়ন করার মাধ্যমে, আপনার ইনার ক্লাস _ID যা কিছু অ্যান্ড্রয়েড ক্লাস নামে একটা প্রাথমিক কি ফিল্ড পেতে পারে যেমন কারসর অ্যাডাপটর এটার থাকাকে প্রত্যাশা করে। এটার প্রয়োজন নেই তবে এটা অ্যান্ড্রয়েড ফ্রেমওয়ার্ক দিয়ে আপনার ডাটাবেজ চমৎকারভাবে কাজ করতে পারবে।
উদাহরণস্বরূপ, এই স্নিপেট একটি সিঙ্গেল টেবিলের জন্য টেবিল নাম এবং কলাম নাম নির্ধারণ করে দেয়:
public final class FeedReaderContract {
// To prevent someone from accidentally instantiating the contract class,
// give it an empty constructor.
public FeedReaderContract() {}
/* Inner class that defines the table contents */
public static abstract class FeedEntry implements BaseColumns {
public static final String TABLE_NAME = "entry";
public static final String COLUMN_NAME_ENTRY_ID = "entryid";
public static final String COLUMN_NAME_TITLE = "title";
public static final String COLUMN_NAME_SUBTITLE = "subtitle";
...
}
}