前言
提示:这里可以添加本文要记录的大概内容:
例如:随着计算机的不断发展,安卓开发这门技术也越来越重要,本文就介绍一个安卓的一个项目
提示:以下是本篇文章正文内容,下面案例可供参考
一、Android是什么?
Android是一个基于Linux内核的开源操作系统,主要被设计用于触屏移动设备,如智能手机和平板电脑。随着技术的发展,Android系统也被用于可穿戴设备、电视、汽车、游戏机等多种设备。Android操作系统由Google公司领导开发,并由开放手机联盟(Open Handset Alliance)支持。
二、本项目的部分代码展示
本项目的成果展示
开始界面
导航界面
我的界面
视频
项目目录结构
├── app app
| └── src
| └── main
| | └── java 源码目录
| | | ├── bean bean目录
| | | ├── components 自定义组件目录
| | | ├── ui ui目录
| | | | └── main mian目录
| | | | └── home home目录
| | | | | ├── HomeScreen
| | | | | └── HomeViewModel
| | | | └── MainScreen
| | | ├── utils 工具类目录
| | | ├── WanActivity 唯一Activity
| | | ├── WanApplication Application
| | | ├── WanTheme Theme
| | | ├── WanNavGraph 导航图
| | | └── WanViewModel ViewModel
| | |
| | └── res 资源目录
| | └── AndroidManifest.xml 配置文件
| |
| ├── build.gradle 模块构建配置
| ├── dictionary 自定义混淆字典
| └── proguard-rules.pro 代码混淆配置文件
|
├── library-base 基础library(library开头为公共库,任何项目都可使用)
| └── src
| └── main
| | ├── assets assets目录
| | └── java 源码目录
| | ├── activity Activity目录
| | ├── adapter Adapter目录
| | ├── bus 消息总线目录
| | ├── db Database目录
| | ├── dialog Dialog目录
| | ├── http 网络请求目录
| | ├── provider ContentProvider目录
| | ├── service Service目录
| | ├── utils 工具类目录
| | └── view 自定义view目录
| |
| └── build.gradle 模块构建配置
|
├── library-picture 图片模块(目录同app,不再展开)
|
├── library-plugin 插件模块
| └── src
| └── main
| ├── kotlin 源码目录
| └── resources 配置目录
| └── statistic.properties 插件配置
|
├── repos 插件生成目录
|
├── build.gradle 项目构建配置
├── config.properties 项目配置
├── gradle.properties gradle配置
└── settings.gradle 项目依赖配置
1.引入库
源码地址:gitee
https://gitee.com/hu-yule/android-project-showcase
部分源码展示:
package com.example.fragment.project.database.user;
import android.database.Cursor;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.room.CoroutinesRoom;
import androidx.room.EntityDeletionOrUpdateAdapter;
import androidx.room.EntityInsertionAdapter;
import androidx.room.RoomDatabase;
import androidx.room.RoomSQLiteQuery;
import androidx.room.util.CursorUtil;
import androidx.room.util.DBUtil;
import androidx.sqlite.db.SupportSQLiteStatement;
import java.lang.Class;
import java.lang.Exception;
import java.lang.Integer;
import java.lang.Long;
import java.lang.Object;
import java.lang.Override;
import java.lang.String;
import java.lang.SuppressWarnings;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.Callable;
import javax.annotation.processing.Generated;
import kotlin.coroutines.Continuation;
import kotlinx.coroutines.flow.Flow;
@Generated("androidx.room.RoomProcessor")
@SuppressWarnings({"unchecked", "deprecation"})
public final class UserDao_Impl implements UserDao {
private final RoomDatabase __db;
private final EntityInsertionAdapter<User> __insertionAdapterOfUser;
private final EntityDeletionOrUpdateAdapter<User> __deletionAdapterOfUser;
public UserDao_Impl(@NonNull final RoomDatabase __db) {
this.__db = __db;
this.__insertionAdapterOfUser = new EntityInsertionAdapter<User>(__db) {
@Override
@NonNull
protected String createQuery() {
return "INSERT OR REPLACE INTO `User` (`unique_id`,`id`,`username`,`nickname`,`dark_theme`) VALUES (?,?,?,?,?)";
}
@Override
protected void bind(@NonNull final SupportSQLiteStatement statement,
@NonNull final User entity) {
statement.bindLong(1, entity.getUniqueId());
statement.bindString(2, entity.getId());
statement.bindString(3, entity.getUsername());
statement.bindString(4, entity.getNickname());
final int _tmp = entity.getDarkTheme() ? 1 : 0;
statement.bindLong(5, _tmp);
}
};
this.__deletionAdapterOfUser = new EntityDeletionOrUpdateAdapter<User>(__db) {
@Override
@NonNull
protected String createQuery() {
return "DELETE FROM `User` WHERE `unique_id` = ?";
}
@Override
protected void bind(@NonNull final SupportSQLiteStatement statement,
@NonNull final User entity) {
statement.bindLong(1, entity.getUniqueId());
}
};
}
@Override
public Object insert(final User user, final Continuation<? super Long> $completion) {
return CoroutinesRoom.execute(__db, true, new Callable<Long>() {
@Override
@NonNull
public Long call() throws Exception {
__db.beginTransaction();
try {
final Long _result = __insertionAdapterOfUser.insertAndReturnId(user);
__db.setTransactionSuccessful();
return _result;
} finally {
__db.endTransaction();
}
}
}, $completion);
}
@Override
public Object delete(final User user, final Continuation<? super Integer> $completion) {
return CoroutinesRoom.execute(__db, true, new Callable<Integer>() {
@Override
@NonNull
public Integer call() throws Exception {
int _total = 0;
__db.beginTransaction();
try {
_total += __deletionAdapterOfUser.handle(user);
__db.setTransactionSuccessful();
return _total;
} finally {
__db.endTransaction();
}
}
}, $completion);
}
@Override
public Flow<User> get() {
final String _sql = "SELECT * FROM user";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
return CoroutinesRoom.createFlow(__db, false, new String[] {"user"}, new Callable<User>() {
@Override
@Nullable
public User call() throws Exception {
final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
try {
final int _cursorIndexOfUniqueId = CursorUtil.getColumnIndexOrThrow(_cursor, "unique_id");
final int _cursorIndexOfId = CursorUtil.getColumnIndexOrThrow(_cursor, "id");
final int _cursorIndexOfUsername = CursorUtil.getColumnIndexOrThrow(_cursor, "username");
final int _cursorIndexOfNickname = CursorUtil.getColumnIndexOrThrow(_cursor, "nickname");
final int _cursorIndexOfDarkTheme = CursorUtil.getColumnIndexOrThrow(_cursor, "dark_theme");
final User _result;
if (_cursor.moveToFirst()) {
final String _tmpId;
_tmpId = _cursor.getString(_cursorIndexOfId);
final String _tmpUsername;
_tmpUsername = _cursor.getString(_cursorIndexOfUsername);
final String _tmpNickname;
_tmpNickname = _cursor.getString(_cursorIndexOfNickname);
final boolean _tmpDarkTheme;
final int _tmp;
_tmp = _cursor.getInt(_cursorIndexOfDarkTheme);
_tmpDarkTheme = _tmp != 0;
_result = new User(_tmpId,_tmpUsername,_tmpNickname,_tmpDarkTheme);
final long _tmpUniqueId;
_tmpUniqueId = _cursor.getLong(_cursorIndexOfUniqueId);
_result.setUniqueId(_tmpUniqueId);
} else {
_result = null;
}
return _result;
} finally {
_cursor.close();
}
}
@Override
protected void finalize() {
_statement.release();
}
});
}
@NonNull
public static List<Class<?>> getRequiredConverters() {
return Collections.emptyList();
}
}
2.读入数据
代码如下(示例):
package com.example.fragment.project.database;
import androidx.annotation.NonNull;
import androidx.room.DatabaseConfiguration;
import androidx.room.InvalidationTracker;
import androidx.room.RoomDatabase;
import androidx.room.RoomOpenHelper;
import androidx.room.migration.AutoMigrationSpec;
import androidx.room.migration.Migration;
import androidx.room.util.DBUtil;
import androidx.room.util.TableInfo;
import androidx.sqlite.db.SupportSQLiteDatabase;
import androidx.sqlite.db.SupportSQLiteOpenHelper;
import com.example.fragment.project.database.history.HistoryDao;
import com.example.fragment.project.database.history.HistoryDao_Impl;
import com.example.fragment.project.database.user.UserDao;
import com.example.fragment.project.database.user.UserDao_Impl;
import java.lang.Class;
import java.lang.Override;
import java.lang.String;
import java.lang.SuppressWarnings;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.processing.Generated;
@Generated("androidx.room.RoomProcessor")
@SuppressWarnings({"unchecked", "deprecation"})
public final class AppDatabase_Impl extends AppDatabase {
private volatile HistoryDao _historyDao;
private volatile UserDao _userDao;
@Override
@NonNull
protected SupportSQLiteOpenHelper createOpenHelper(@NonNull final DatabaseConfiguration config) {
final SupportSQLiteOpenHelper.Callback _openCallback = new RoomOpenHelper(config, new RoomOpenHelper.Delegate(3) {
@Override
public void createAllTables(@NonNull final SupportSQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS `History` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `key` TEXT NOT NULL, `value` TEXT NOT NULL, `url` TEXT NOT NULL)");
db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`unique_id` INTEGER NOT NULL, `id` TEXT NOT NULL, `username` TEXT NOT NULL, `nickname` TEXT NOT NULL, `dark_theme` INTEGER NOT NULL, PRIMARY KEY(`unique_id`))");
db.execSQL("CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)");
db.execSQL("INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a9fd6588dfa37fa72291628ffe8b5e59')");
}
@Override
public void dropAllTables(@NonNull final SupportSQLiteDatabase db) {
db.execSQL("DROP TABLE IF EXISTS `History`");
db.execSQL("DROP TABLE IF EXISTS `User`");
final List<? extends RoomDatabase.Callback> _callbacks = mCallbacks;
if (_callbacks != null) {
for (RoomDatabase.Callback _callback : _callbacks) {
_callback.onDestructiveMigration(db);
}
}
}
@Override
public void onCreate(@NonNull final SupportSQLiteDatabase db) {
final List<? extends RoomDatabase.Callback> _callbacks = mCallbacks;
if (_callbacks != null) {
for (RoomDatabase.Callback _callback : _callbacks) {
_callback.onCreate(db);
}
}
}
@Override
public void onOpen(@NonNull final SupportSQLiteDatabase db) {
mDatabase = db;
internalInitInvalidationTracker(db);
final List<? extends RoomDatabase.Callback> _callbacks = mCallbacks;
if (_callbacks != null) {
for (RoomDatabase.Callback _callback : _callbacks) {
_callback.onOpen(db);
}
}
}
@Override
public void onPreMigrate(@NonNull final SupportSQLiteDatabase db) {
DBUtil.dropFtsSyncTriggers(db);
}
@Override
public void onPostMigrate(@NonNull final SupportSQLiteDatabase db) {
}
@Override
@NonNull
public RoomOpenHelper.ValidationResult onValidateSchema(
@NonNull final SupportSQLiteDatabase db) {
final HashMap<String, TableInfo.Column> _columnsHistory = new HashMap<String, TableInfo.Column>(4);
_columnsHistory.put("id", new TableInfo.Column("id", "INTEGER", true, 1, null, TableInfo.CREATED_FROM_ENTITY));
_columnsHistory.put("key", new TableInfo.Column("key", "TEXT", true, 0, null, TableInfo.CREATED_FROM_ENTITY));
_columnsHistory.put("value", new TableInfo.Column("value", "TEXT", true, 0, null, TableInfo.CREATED_FROM_ENTITY));
_columnsHistory.put("url", new TableInfo.Column("url", "TEXT", true, 0, null, TableInfo.CREATED_FROM_ENTITY));
final HashSet<TableInfo.ForeignKey> _foreignKeysHistory = new HashSet<TableInfo.ForeignKey>(0);
final HashSet<TableInfo.Index> _indicesHistory = new HashSet<TableInfo.Index>(0);
final TableInfo _infoHistory = new TableInfo("History", _columnsHistory, _foreignKeysHistory, _indicesHistory);
final TableInfo _existingHistory = TableInfo.read(db, "History");
if (!_infoHistory.equals(_existingHistory)) {
return new RoomOpenHelper.ValidationResult(false, "History(com.example.fragment.project.database.history.History).\n"
+ " Expected:\n" + _infoHistory + "\n"
+ " Found:\n" + _existingHistory);
}
final HashMap<String, TableInfo.Column> _columnsUser = new HashMap<String, TableInfo.Column>(5);
_columnsUser.put("unique_id", new TableInfo.Column("unique_id", "INTEGER", true, 1, null, TableInfo.CREATED_FROM_ENTITY));
_columnsUser.put("id", new TableInfo.Column("id", "TEXT", true, 0, null, TableInfo.CREATED_FROM_ENTITY));
_columnsUser.put("username", new TableInfo.Column("username", "TEXT", true, 0, null, TableInfo.CREATED_FROM_ENTITY));
_columnsUser.put("nickname", new TableInfo.Column("nickname", "TEXT", true, 0, null, TableInfo.CREATED_FROM_ENTITY));
_columnsUser.put("dark_theme", new TableInfo.Column("dark_theme", "INTEGER", true, 0, null, TableInfo.CREATED_FROM_ENTITY));
final HashSet<TableInfo.ForeignKey> _foreignKeysUser = new HashSet<TableInfo.ForeignKey>(0);
final HashSet<TableInfo.Index> _indicesUser = new HashSet<TableInfo.Index>(0);
final TableInfo _infoUser = new TableInfo("User", _columnsUser, _foreignKeysUser, _indicesUser);
final TableInfo _existingUser = TableInfo.read(db, "User");
if (!_infoUser.equals(_existingUser)) {
return new RoomOpenHelper.ValidationResult(false, "User(com.example.fragment.project.database.user.User).\n"
+ " Expected:\n" + _infoUser + "\n"
+ " Found:\n" + _existingUser);
}
return new RoomOpenHelper.ValidationResult(true, null);
}
}, "a9fd6588dfa37fa72291628ffe8b5e59", "18a48e6ea5540b68960b244769cd1423");
final SupportSQLiteOpenHelper.Configuration _sqliteConfig = SupportSQLiteOpenHelper.Configuration.builder(config.context).name(config.name).callback(_openCallback).build();
final SupportSQLiteOpenHelper _helper = config.sqliteOpenHelperFactory.create(_sqliteConfig);
return _helper;
}
@Override
@NonNull
protected InvalidationTracker createInvalidationTracker() {
final HashMap<String, String> _shadowTablesMap = new HashMap<String, String>(0);
final HashMap<String, Set<String>> _viewTables = new HashMap<String, Set<String>>(0);
return new InvalidationTracker(this, _shadowTablesMap, _viewTables, "History","User");
}
@Override
public void clearAllTables() {
super.assertNotMainThread();
final SupportSQLiteDatabase _db = super.getOpenHelper().getWritableDatabase();
try {
super.beginTransaction();
_db.execSQL("DELETE FROM `History`");
_db.execSQL("DELETE FROM `User`");
super.setTransactionSuccessful();
} finally {
super.endTransaction();
_db.query("PRAGMA wal_checkpoint(FULL)").close();
if (!_db.inTransaction()) {
_db.execSQL("VACUUM");
}
}
}
@Override
@NonNull
protected Map<Class<?>, List<Class<?>>> getRequiredTypeConverters() {
final HashMap<Class<?>, List<Class<?>>> _typeConvertersMap = new HashMap<Class<?>, List<Class<?>>>();
_typeConvertersMap.put(HistoryDao.class, HistoryDao_Impl.getRequiredConverters());
_typeConvertersMap.put(UserDao.class, UserDao_Impl.getRequiredConverters());
return _typeConvertersMap;
}
@Override
@NonNull
public Set<Class<? extends AutoMigrationSpec>> getRequiredAutoMigrationSpecs() {
final HashSet<Class<? extends AutoMigrationSpec>> _autoMigrationSpecsSet = new HashSet<Class<? extends AutoMigrationSpec>>();
return _autoMigrationSpecsSet;
}
@Override
@NonNull
public List<Migration> getAutoMigrations(
@NonNull final Map<Class<? extends AutoMigrationSpec>, AutoMigrationSpec> autoMigrationSpecs) {
final List<Migration> _autoMigrations = new ArrayList<Migration>();
return _autoMigrations;
}
@Override
public HistoryDao historyDao() {
if (_historyDao != null) {
return _historyDao;
} else {
synchronized(this) {
if(_historyDao == null) {
_historyDao = new HistoryDao_Impl(this);
}
return _historyDao;
}
}
}
@Override
public UserDao userDao() {
if (_userDao != null) {
return _userDao;
} else {
synchronized(this) {
if(_userDao == null) {
_userDao = new UserDao_Impl(this);
}
return _userDao;
}
}
}
}