首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 連接本地 MongoDB 報 Deprecated 警告:構造函數棄用與模擬器網絡配置雙重解決

     編輯:程式設計綜合問答

問題現象

Eclipse + Android SDK + MongoDB 2.6.6 + mongo-java-driver 2.13.0-rc2。
代碼中使用 `new Mongo("localhost")` 等構造函數,編碼提示 **Deprecated (棄用)**,模擬器運行報錯。

雙重核心問題

問題一:Mongo Java Driver 3.0+ 棄用舊 API

Driver 3.0 (2018 年發布) 完全重寫 API,舊 `Mongo`、`DB`、`DBCollection` 類被標記 `@Deprecated`,新 API 為:

舊 API (Deprecated)新 API (3.0+)
`new Mongo()` / `new Mongo(host)``MongoClients.create("mongodb://host:port")`
`mongo.getDB("name")``client.getDatabase("name")`
`db.getCollection("name")``database.getCollection("name")`
`DBObject` / `BasicDBObject``Document` (org.bson.Document)
`WriteConcern.SAFE``WriteConcern.ACKNOWLEDGED`

問題二:Android 模擬器無法訪問宿主機 localhost

Android 模擬器網絡隔離:localhost (127.0.0.1) 指向模擬器自身,而非宿主機 (開發電腦)。

解決:使用特殊 IP 10.0.2.2 映射到宿主機回環地址。

完整修正代碼 (Mongo Java Driver 3.12+)


import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.MongoCollection;
import org.bson.Document;
import com.mongodb.WriteConcern;

public class MainActivity extends AppCompatActivity {
    // ... UI 初始化 ...

    @SuppressLint("SetTextI18n")
    public void SaveButton_Click(View view) {
        // 1. 使用新 API 創建客戶端 (連接宿主機 MongoDB)
        // 注意:10.0.2.2 是模擬器訪問宿主機的特殊 IP
        String uri = "mongodb://10.0.2.2:27017"; 
        
        // 建議使用單例模式管理 MongoClient,避免頻繁創建連接
        MongoClient mongoClient = MongoClients.create(uri);
        
        try {
            // 2. 獲取數據庫和集合
            MongoDatabase database = mongoClient.getDatabase("grade");
            MongoCollection collection = database.getCollection("Student");
            
            // 3. 構建文檔 (使用新 Document 類)
            Document doc = new Document()
                .append("name", ((EditText)findViewById(R.id.nameEditText)).getText().toString())
                .append("num", ((EditText)findViewById(R.id.numEditText)).getText().toString())
                .append("age", ((EditText)findViewById(R.id.ageEditText)).getText().toString())
                .append("sexual", ((EditText)findViewById(R.id.sexualEditText)).getText().toString());
            
            // 4. 寫入 (默認 ACKNOWLEDGED)
            collection.insertOne(doc);
            
            Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, "保存失敗: " + e.getMessage(), Toast.LENGTH_LONG).show();
        } finally {
            // 實際應用中 MongoClient 應為長連接單例,此處演示關閉
            // mongoClient.close(); 
        }
    }
}

關鍵修正點總結

  1. 依賴更新:`build.gradle` 中使用新版驅動:
    implementation 'org.mongodb:mongodb-driver-sync:4.8.0' // 或更新版本
    
  2. 連接字符串:`mongodb://10.0.2.2:27017` (模擬器) 或 `mongodb://<宿主機局域網IP>:27017` (真機調試)。
  3. 新 API 鏈式調用:`MongoClients.create → getDatabase → getCollection → insertOne`。
  4. Document 替代 BasicDBObject:更符合 JSON 直觀認知,支持鏈式 `append`。
  5. 網絡線程:嚴禁主線程網絡操作!實際項目中必須放入子線程 (RxJava, Coroutines, ExecutorService, Thread)。
  6. MongoClient 單例:全局創建一次,應用生命周期內復用,關閉在 `Application.onTerminate()` 或進程結束時。

真機調試網絡配置

  • 手機與開發電脑連接**同一 WiFi**。
  • 查看電腦局域網 IP (`ipconfig` / `ifconfig`),如 `192.168.1.100`。
  • MongoDB 綁定 0.0.0.0 或具體 IP:`mongod --bind_ip 0.0.0.0`。
  • 防火牆開放 27017 端口。
  • AndroidManifest 添加權限:``
  • 連接字符串:`mongodb://192.168.1.100:27017`

參考資源

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved