[Firebase] 1. AngularFire, $save, $add and $remove, Forge

本文介绍如何使用Angular结合Firebase实现数据的实时同步与CRUD操作。通过示例代码展示了如何创建项目,连接Firebase,并进行数据的添加、更新和删除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Basic angularFire options: $save, $add and $remove.

The way connect firebase:

var app = angular.module('app', ['firebase']);
    var ref = new Firebase(FIREBASE_URI);
    //create an item storage
    var items = $firebase(ref);

 

Example:

<!DOCTYPE html>
<html ng-app="app">
<head lang="en">
    <meta charset="UTF-8">
    <title>Angular Firebase</title>
    <link href="bower_components/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet"/>

</head>
<body ng-controller="MainCtrl">
<table class="table edit">
    <thead>
    <tr>
        <th>Name</th>
        <th>Description</th>
        <th>Count</th>
        <th></th>
    </tr>
    </thead>
    <tbody>
    <tr ng-repeat="(id, item) in items">
        <td><input type="text" ng-model="item.name" ng-blur="updateItem(id)"/></td>
        <td><input type="text" ng-model="item.description" ng-blur="updateItem(id)"/></td>
        <td><input type="text" ng-model="item.count" ng-blur="updateItem(id)"/></td>
        <td>
            <a href="#" ng-click="removeItem(id)" class="navbar-link">Remove</a>
        </td>
    </tr>
    </tbody>
</table>

<div class="well">
    <h4>Add Item</h4>

    <form class="form-inline" role="form" novalidate ng-submit="addItem()">
        <div class="form-group">
            <input type="text" class="form-control" ng-model="newItem.name" placeholder="Name">
        </div>
        <div class="form-group">
            <input type="text" class="form-control" ng-model="newItem.description" placeholder="Description">
        </div>
        <div class="form-group">
            <input type="text" class="form-control" ng-model="newItem.count" placeholder="Count">
        </div>
        <button type="submit" class="btn btn-default">Add</button>
    </form>
</div>

<script src="bower_components/jquery/dist/jquery.min.js"></script>
<script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.13/angular.min.js"></script>
<script src="https://cdn.firebase.com/v0/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/0.6.0/angularfire.js"></script>
<script src="public/js/app.js"></script>
</body>
</html>

 

/**
 * Created by Answer1215 on 11/9/2014.
 */

var app = angular.module('app', ['firebase']);

app.constant('FIREBASE_URI', 'https://<your_app>.firebaseio.com/');

app.controller('MainCtrl', ['$scope', 'ItemsService', function ($scope, ItemsService) {
    $scope.newItem = { name: '', description: '', count: 0 };
    $scope.currentItem = null;

    $scope.items = ItemsService.getItems();

    $scope.addItem = function () {
        ItemsService.addItem(angular.copy($scope.newItem));
        $scope.newItem = { name: '', description: '', count: 0 };
    };

    $scope.updateItem = function (id) {
        ItemsService.updateItem(id);
    };

    $scope.removeItem = function (id) {
        ItemsService.removeItem(id);
    };
}]);

app.factory('ItemsService', ['$firebase', 'FIREBASE_URI', function ($firebase, FIREBASE_URI) {
    var ref = new Firebase(FIREBASE_URI);
    var items = $firebase(ref);

    var getItems = function () {
        return items;
    };

    var addItem = function (item) {
        items.$add(item);
    };

    var updateItem = function (id) {
        items.$save(id);
    };

    var removeItem = function (id) {
        items.$remove(id);
    };

    return {
        getItems: getItems,
        addItem: addItem,
        updateItem: updateItem,
        removeItem: removeItem
    }
}]);

 

Also take a look the Forge, The easy way you can go to your app's forage is copy paste the FIREBASE_URI into boswer.

In Forge, you can modify, remove or add the data. Also you can import JSON format data into the Forage, all those things happen in real time.

W Failed to get heartbeats header java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/datastore/preferences/PreferenceDataStoreDelegateKt; at com.google.android.gms.tasks.Tasks.zza(com.google.android.gms:play-services-tasks@@18.1.0:5) at com.google.android.gms.tasks.Tasks.await(com.google.android.gms:play-services-tasks@@18.1.0:9) at com.google.firebase.installations.remote.FirebaseInstallationServiceClient.openHttpURLConnection(FirebaseInstallationServiceClient.java:487) at com.google.firebase.installations.remote.FirebaseInstallationServiceClient.createFirebaseInstallation(FirebaseInstallationServiceClient.java:163) at com.google.firebase.installations.FirebaseInstallations.registerFidWithServer(FirebaseInstallations.java:534) at com.google.firebase.installations.FirebaseInstallations.doNetworkCallIfNecessary(FirebaseInstallations.java:388) at com.google.firebase.installations.FirebaseInstallations.lambda$doRegistrationOrRefresh$3$com-google-firebase-installations-FirebaseInstallations(FirebaseInstallations.java:373) at com.google.firebase.installations.FirebaseInstallations$$ExternalSyntheticLambda0.run(Unknown Source:4) at com.google.firebase.concurrent.SequentialExecutor$1.run(SequentialExecutor.java:117) at com.google.firebase.concurrent.SequentialExecutor$QueueWorker.workOnQueue(SequentialExecutor.java:229) at com.google.firebase.concurrent.SequentialExecutor$QueueWorker.run(SequentialExecutor.java:174) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1156) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:651) at com.google.firebase.concurrent.CustomThreadFactory.lambda$newThread$0$com-google-firebase-concurrent-CustomThreadFactory(CustomThreadFactory.java:47) at com.google.firebase.concurrent.CustomThreadFactory$$ExternalSyntheticLambda0.run(Unknown Source:4) at java.lang.Thread.run(Thread.java:1119)
08-09
<think>我们遇到了一个错误:`java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/datastore/preferences/PreferenceDataStoreDelegateKt;` 这个错误表明在运行时找不到 `androidx.datastore.preferences.PreferenceDataStoreDelegateKt` 类。这通常发生在以下情况: 1. 项目中没有添加所需的依赖库。 2. 依赖库版本冲突,导致所需的类没有被正确包含。 根据堆栈信息,这个错误发生在Firebase安装过程中(`FirebaseInstallations`),具体是在尝试与服务器通信时发生的。从错误信息看,问题与DataStore库有关。 解决方案: 1. **添加DataStore依赖**:在应用级别的build.gradle文件中添加以下依赖: ```gradle dependencies { // 其他依赖... implementation "androidx.datastore:datastore-preferences:1.0.0" // 或者根据你的项目需要选择最新版本 } ``` 注意:请检查最新版本,目前1.0.0是稳定版本,但可能已经有更新。 2. **检查依赖冲突**:如果已经添加了DataStore库,可能是版本冲突。可以尝试使用Gradle命令检查依赖树: ``` ./gradlew app:dependencies ``` 查看是否有多个版本的DataStore库,如果有,可以通过强制指定版本解决: ```gradle implementation("androidx.datastore:datastore-preferences:1.0.0") { force = true } ``` 3. **清理和重建**:在修改依赖后,执行清理和重建操作: - 选择菜单:Build -> Clean Project - 然后:Build -> Rebuild Project 4. **检查Proguard/R8规则**:如果启用了代码混淆,确保DataStore库的类不被移除。在proguard-rules.pro文件中添加: ```proguard -keep class androidx.datastore.** { *; } ``` 5. **检查MultiDex**:如果方法数超过65536,需要启用MultiDex。在build.gradle中: ```gradle defaultConfig { multiDexEnabled true } ``` 并添加依赖: ```gradle implementation 'androidx.multidex:multidex:2.0.1' ``` 这个错误是因为Firebase内部可能使用了DataStore库,而你的项目中没有包含它,或者包含的版本有问题。 注意:在Firebase的某些版本中,可能会引入对AndroidX库的依赖,因此需要确保项目已经迁移到AndroidX,并且相关依赖都正确添加。 如果问题仍然存在,可以尝试升级Firebase BOM到最新版本,因为可能在新版本中修复了此问题。 根据错误日志,问题发生在`com.google.firebase.installations`中,所以也可以考虑单独更新Firebase Installations库的版本。 §§相关问题§§ 1. 如何解决Android开发中的`java.lang.NoClassDefFoundError`错误? 2. 在Gradle中如何强制指定某个依赖库的版本? 3. 如何检查Android项目中的依赖冲突? 4. 为什么Proguard或R8会导致运行时出现`NoClassDefFoundError`?如何避免? 5. 在什么情况下需要启用MultiDex?如何配置?</think>### 错误分析:`NoClassDefFoundError: androidx/datastore/preferences/PreferenceDataStoreDelegateKt` 这个错误表明 Firebase SDK 尝试访问 AndroidX DataStore 库中的类,但你的项目缺少相关依赖。主要原因是: 1. **Firebase 新增依赖** Firebase BOM 34.1.0 开始依赖 `androidx.datastore` 库,但未在 BOM 中自动包含 2. **依赖传递中断** 当使用 ProGuard/R8 或 multidex 时,可能意外移除了必需类 --- ### 解决方案 #### 1. 添加显式依赖(关键步骤) 在 `app/build.gradle` 中添加: ```gradle dependencies { // 添加 DataStore 依赖 implementation "androidx.datastore:datastore-preferences:1.1.0" // 确保包含所有 Firebase 核心库 implementation platform('com.google.firebase:firebase-bom:34.1.0') implementation 'com.google.firebase:firebase-messaging' implementation 'com.google.firebase:firebase-installations' // 显式添加 } ``` #### 2. 检查 ProGuard/R8 规则 在 `proguard-rules.pro` 中添加: ```proguard # 保留 DataStore 相关类 -keep class androidx.datastore.** { *; } -keep class com.google.firebase.installations.** { *; } ``` #### 3. 多 Dex 配置(针对 API < 21) 在 `build.gradle` 中启用: ```gradle android { defaultConfig { multiDexEnabled true } } dependencies { implementation 'androidx.multidex:multidex:2.0.1' } ``` #### 4. 清理构建缓存 ```bash # 终端执行 ./gradlew cleanBuildCache rm -rf ~/.gradle/caches/ ``` #### 5. 验证依赖树 检查依赖冲突: ```bash ./gradlew app:dependencies --configuration releaseRuntimeClasspath ``` 观察是否有 `androidx.datastore` 被其他库排除 --- ### 根本原因说明 Firebase 34.1.0 的 `firebase-installations` 组件内部使用 DataStore 管理本地缓存,但: - 该依赖未在 BOM 中声明为强制传递依赖 - 新添加的 Kotlin 扩展函数 `PreferenceDataStoreDelegateKt` 易被混淆工具移除 > **注意**:此问题已在 Firebase BOM 34.2.0 中修复,建议直接升级: > ```gradle > implementation platform('com.google.firebase:firebase-bom:34.2.0') > ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值