java android持久化数据

时间:2025-04-18 19:18:40

1. SQLite 数据库(Android 内置)

1.1 创建数据库帮助类

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "MyDatabase.db";
    private static final int DATABASE_VERSION = 1;
    
    // 表名和列名
    public static final String TABLE_USERS = "users";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_NAME = "name";
    public static final String COLUMN_EMAIL = "email";
    
    // 创建表的SQL语句
    private static final String CREATE_TABLE_USERS = 
            "CREATE TABLE " + TABLE_USERS + " (" +
                    COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                    COLUMN_NAME + " TEXT NOT NULL, " +
                    COLUMN_EMAIL + " TEXT);";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_TABLE_USERS);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_USERS);
        onCreate(db);
    }
}

1.2 数据库操作示例

public class DatabaseOperations {
    private DatabaseHelper dbHelper;
    private SQLiteDatabase database;

    public DatabaseOperations(Context context) {
        dbHelper = new DatabaseHelper(context);
    }

    public void open() throws SQLException {
        database = dbHelper.getWritableDatabase();
    }

    public void close() {
        dbHelper.close();
    }

    // 插入数据
    public long insertUser(String name, String email) {
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_NAME, name);
        values.put(DatabaseHelper.COLUMN_EMAIL, email);
        return database.insert(DatabaseHelper.TABLE_USERS, null, values);
    }

    // 查询所有用户
    public Cursor getAllUsers() {
        String[] columns = {
                DatabaseHelper.COLUMN_ID,
                DatabaseHelper.COLUMN_NAME,
                DatabaseHelper.COLUMN_EMAIL
        };
        return database.query(DatabaseHelper.TABLE_USERS, columns, 
                null, null, null, null, null);
    }

    // 更新用户
    public int updateUser(long id, String name, String email) {
        ContentValues values = new ContentValues();
        values.put(DatabaseHelper.COLUMN_NAME, name);
        values.put(DatabaseHelper.COLUMN_EMAIL, email);
        return database.update(DatabaseHelper.TABLE_USERS, values, 
                DatabaseHelper.COLUMN_ID + " = " + id, null);
    }

    // 删除用户
    public void deleteUser(long id) {
        database.delete(DatabaseHelper.TABLE_USERS, 
                DatabaseHelper.COLUMN_ID + " = " + id, null);
    }
}

1.3 在Activity中使用

public class MainActivity extends AppCompatActivity {
    private DatabaseOperations dbOperations;
    private ListView listView;
    private SimpleCursorAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        dbOperations = new DatabaseOperations(this);
        dbOperations.open();
        
        listView = findViewById(R.id.listView);
        
        // 添加一些示例数据
        dbOperations.insertUser("张三", "zhangsan@example.com");
        dbOperations.insertUser("李四", "lisi@example.com");
        
        displayUsers();
    }
    
    private void displayUsers() {
        Cursor cursor = dbOperations.getAllUsers();
        
        String[] fromColumns = {
            DatabaseHelper.COLUMN_NAME, 
            DatabaseHelper.COLUMN_EMAIL
        };
        int[] toViews = {R.id.textName, R.id.textEmail};
        
        adapter = new SimpleCursorAdapter(this, 
                R.layout.user_item, cursor, fromColumns, toViews, 0);
        
        listView.setAdapter(adapter);
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        dbOperations.close();
    }
}

2. Room 持久化库(推荐)

2.1 添加依赖

build.gradle 文件中添加:

implementation "androidx.room:room-runtime:2.4.0"
annotationProcessor "androidx.room:room-compiler:2.4.0"

2.2 创建实体类

@Entity(tableName = "users")
public class User {
    @PrimaryKey(autoGenerate = true)
    public int id;
    
    @ColumnInfo(name = "name")
    public String name;
    
    @ColumnInfo(name = "email")
    public String email;
    
    // 构造函数、getter和setter
}

2.3 创建DAO接口

@Dao
public interface UserDao {
    @Insert
    void insert(User user);
    
    @Update
    void update(User user);
    
    @Delete
    void delete(User user);
    
    @Query("SELECT * FROM users")
    List<User> getAllUsers();
    
    @Query("SELECT * FROM users WHERE id = :userId")
    User getUserById(int userId);
}

2.4 创建数据库类

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
    
    private static volatile AppDatabase INSTANCE;
    
    public static AppDatabase getDatabase(final Context context) {
        if (INSTANCE == null) {
            synchronized (AppDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(context.getApplicationContext(),
                                    AppDatabase.class, "app_database")
                            .build();
                }
            }
        }
        return INSTANCE;
    }
}

2.5 在Activity中使用

public class MainActivity extends AppCompatActivity {
    private AppDatabase db;
    private UserDao userDao;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        db = AppDatabase.getDatabase(this);
        userDao = db.userDao();
        
        // 在后台线程执行数据库操作
        new Thread(() -> {
            // 插入用户
            User user = new User();
            user.name = "王五";
            user.email = "wangwu@example.com";
            userDao.insert(user);
            
            // 查询用户
            List<User> users = userDao.getAllUsers();
            runOnUiThread(() -> {
                // 更新UI
            });
        }).start();
    }
}