关于Android中DatabaseHelper和Database的关系

关于Android中DatabaseHelper和Database的关系

简单来说,DatabaseHelper 可以看成是 Database 的工厂类。

想得到Database,需要首先得到一个DatabaseHelper的对象,得到的方法很简单,直接使用new就可以了,会自动调用DatabaseHelper的构造方法,构造方法传入的参数分别是 (Context,数据库名,一般为null的值,版本号),注意此时虽然传入了数据库名,但是并没有实际创建数据库。

然后使用helper中的getWritableDatabase即可,此处如果是对getWritableDatabase的第一次调用,那么程序会创建相应的数据库,并自动调用onCreate方法。(所以说onCreate方法中的create,指的既不是DatabaseHelper的创建,也不是表的创建,而是数据库的创建。) 所以一般建议在onCreate中加入创建表的语句,也就是创建了数据库之后,马上创建相应的表,这也很符合一般人的逻辑。

粗略画了一个uml图,可能不是很严谨

 

package com.example.t11;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.Date;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    Button button1;
    Button button2;
    MyDatabaseHelper MyDBHelper;
    SQLiteDatabase MyDB;
    Boolean continued;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        continued=true;
        MyDBHelper=new MyDatabaseHelper(this,"T11.db",null,1);//得到helper

        button1=findViewById(R.id.button1);
        button2=findViewById(R.id.button2);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.button1://点击按钮1之后,从databaseHelper那里得到相应的database
                MyDB=MyDBHelper.getWritableDatabase();

//以下是关于插入数据的操作,不重要
                ContentValues values=new ContentValues();
                while (continued==true){
                    values.put("content","hello");
                    values.put("time",new Date().toLocaleString());
                    MyDB.insert("t11",null,values);
                    SystemClock.sleep(2000);
                }
//以上是关于插入数据的操作,不重要

            case R.id.button2:
                continued=false;
        }
    }

    class MyDatabaseHelper extends SQLiteOpenHelper {
        Context mContext;
        private final String CREATE_BOOK="create table t11("+
                "content text ,"+
                "time text)";
        public MyDatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);//databaseHelper 的构造函数
//构造函数的四个参数分别是 context , 数据库名, null, 版本号
            mContext=context;
        }

        @Override
        public void onCreate(SQLiteDatabase sqLiteDatabase) {
            sqLiteDatabase.execSQL(CREATE_BOOK);//在创建好数据库之后,马上在数据库里创建表
            Toast.makeText(MainActivity.this,"创建成功",Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例,演示如何在Android Studio实现通讯录代码。该示例使用SQLite数据库来存储联系人信息。 1. 创建一个新的Android Studio项目,包含一个Activity和一个布局文件。 2. 在布局文件添加一个RecyclerView,用于显示联系人列表。 3. 创建一个数据模型类,用于表示联系人信息。例如: ```java public class Contact { private int id; private String name; private String phoneNumber; public Contact(int id, String name, String phoneNumber) { this.id = id; this.name = name; this.phoneNumber = phoneNumber; } public int getId() { return id; } public String getName() { return name; } public String getPhoneNumber() { return phoneNumber; } } ``` 4. 创建一个SQLite数据库帮助类,用于管理联系人信息的存储和检索。例如: ```java public class DatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "contacts.db"; private static final int DATABASE_VERSION = 1; private static final String TABLE_NAME = "contacts"; private static final String COLUMN_ID = "id"; private static final String COLUMN_NAME = "name"; private static final String COLUMN_PHONE_NUMBER = "phone_number"; public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { String query = "CREATE TABLE " + TABLE_NAME + " (" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT, " + COLUMN_PHONE_NUMBER + " TEXT)"; db.execSQL(query); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); } public void addContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, contact.getName()); values.put(COLUMN_PHONE_NUMBER, contact.getPhoneNumber()); db.insert(TABLE_NAME, null, values); db.close(); } public Contact getContact(int id) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, new String[] { COLUMN_ID, COLUMN_NAME, COLUMN_PHONE_NUMBER }, COLUMN_ID + "=?", new String[] { String.valueOf(id) }, null, null, null, null); if (cursor != null) cursor.moveToFirst(); Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2)); cursor.close(); db.close(); return contact; } public List<Contact> getAllContacts() { List<Contact> contactList = new ArrayList<>(); String query = "SELECT * FROM " + TABLE_NAME; SQLiteDatabase db = this.getWritableDatabase(); Cursor cursor = db.rawQuery(query, null); if (cursor.moveToFirst()) { do { Contact contact = new Contact(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2)); contactList.add(contact); } while (cursor.moveToNext()); } cursor.close(); db.close(); return contactList; } public void updateContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, contact.getName()); values.put(COLUMN_PHONE_NUMBER, contact.getPhoneNumber()); db.update(TABLE_NAME, values, COLUMN_ID + "=?", new String[] { String.valueOf(contact.getId()) }); db.close(); } public void deleteContact(Contact contact) { SQLiteDatabase db = this.getWritableDatabase(); db.delete(TABLE_NAME, COLUMN_ID + "=?", new String[] { String.valueOf(contact.getId()) }); db.close(); } } ``` 5. 在Activity初始化RecyclerView和数据库帮助类,并为其提供数据源。例如: ```java public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private RecyclerView.Adapter adapter; private List<Contact> contactList = new ArrayList<>(); private DatabaseHelper databaseHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recycler_view); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); databaseHelper = new DatabaseHelper(this); contactList = databaseHelper.getAllContacts(); adapter = new ContactAdapter(contactList); recyclerView.setAdapter(adapter); } } ``` 6. 创建一个RecyclerView的适配器,用于将联系人信息显示在列表。例如: ```java public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ViewHolder> { private List<Contact> contactList; public static class ViewHolder extends RecyclerView.ViewHolder { public TextView nameTextView; public TextView phoneNumberTextView; public ViewHolder(View view) { super(view); nameTextView = view.findViewById(R.id.name_text_view); phoneNumberTextView = view.findViewById(R.id.phone_number_text_view); } } public ContactAdapter(List<Contact> contactList) { this.contactList = contactList; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()) .inflate(R.layout.contact_item, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(ViewHolder holder, int position) { Contact contact = contactList.get(position); holder.nameTextView.setText(contact.getName()); holder.phoneNumberTextView.setText(contact.getPhoneNumber()); } @Override public int getItemCount() { return contactList.size(); } } ``` 7. 最后,我们可以在Activity添加一些逻辑来处理用户添加、编辑和删除联系人的操作。例如: ```java public class MainActivity extends AppCompatActivity { private RecyclerView recyclerView; private RecyclerView.Adapter adapter; private List<Contact> contactList = new ArrayList<>(); private DatabaseHelper databaseHelper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); recyclerView = findViewById(R.id.recycler_view); recyclerView.setHasFixedSize(true); recyclerView.setLayoutManager(new LinearLayoutManager(this)); databaseHelper = new DatabaseHelper(this); contactList = databaseHelper.getAllContacts(); adapter = new ContactAdapter(contactList); recyclerView.setAdapter(adapter); FloatingActionButton fab = findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { showAddContactDialog(); } }); } private void showAddContactDialog() { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Add contact"); LayoutInflater inflater = getLayoutInflater(); View dialogView = inflater.inflate(R.layout.dialog_add_contact, null); final EditText nameEditText = dialogView.findViewById(R.id.name_edit_text); final EditText phoneNumberEditText = dialogView.findViewById(R.id.phone_number_edit_text); builder.setView(dialogView); builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { String name = nameEditText.getText().toString(); String phoneNumber = phoneNumberEditText.getText().toString(); Contact contact = new Contact(-1, name, phoneNumber); databaseHelper.addContact(contact); contactList.add(contact); adapter.notifyDataSetChanged(); } }); builder.setNegativeButton("Cancel", null); AlertDialog dialog = builder.create(); dialog.show(); } } ``` 这样,我们就完成了一个简单的通讯录应用程序。用户可以使用该应用程序添加、编辑和删除联系人,并在RecyclerView查看所有联系人信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值