【问题标题】:Error in logcat When Inserting Data into Database将数据插入数据库时​​ logcat 出错
【发布时间】:2015-12-29 08:04:18
【问题描述】:

我创建了一个 Android 应用,用于将纬度和经度插入到本地创建的数据库中。但是当我单击位置按钮时,它在46 上给了我一些 logcat 错误。当我单击位置按钮时,它应该将纬度和经度传递给数据库。有人可以帮我解决这个问题吗?

46 行是:

long result = dbm.insert("location",null,cv);

这是我的日志:

12-29 16:04:22.480: D/gralloc_goldfish(1319): Emulator without GPU emulation detected.
12-29 16:19:55.630: D/GPS Enabled(1319): GPS Enabled
12-29 16:19:55.650: D/AndroidRuntime(1319): Shutting down VM
12-29 16:19:55.650: W/dalvikvm(1319): threadid=1: thread exiting with uncaught exception (group=0xb39feba8)
12-29 16:19:55.700: E/AndroidRuntime(1319): FATAL EXCEPTION: main
12-29 16:19:55.700: E/AndroidRuntime(1319): Process: com.example.gpstracking, PID: 1319
12-29 16:19:55.700: E/AndroidRuntime(1319): java.lang.NullPointerException
12-29 16:19:55.700: E/AndroidRuntime(1319):     at com.example.gpstracking.AndroidGPSTrackingActivity$1.onClick(AndroidGPSTrackingActivity.java:46)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at android.view.View.performClick(View.java:4438)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at android.view.View$PerformClick.run(View.java:18422)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at android.os.Handler.handleCallback(Handler.java:733)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at android.os.Handler.dispatchMessage(Handler.java:95)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at android.os.Looper.loop(Looper.java:136)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at android.app.ActivityThread.main(ActivityThread.java:5001)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at java.lang.reflect.Method.invokeNative(Native Method)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at java.lang.reflect.Method.invoke(Method.java:515)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
12-29 16:19:55.700: E/AndroidRuntime(1319):     at dalvik.system.NativeStart.main(Native Method)
12-29 16:19:59.060: I/Process(1319): Sending signal. PID: 1319 SIG: 9

这是我的主要Activity

package com.example.gpstracking;

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class AndroidGPSTrackingActivity extends Activity {

    Button btnShowLocation;

    // GPSTracker class
    GPSTracker gps;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btnShowLocation = (Button) findViewById(R.id.btnShowLocation);

        // show location button click event
        btnShowLocation.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View arg0) {        
                // create class object
                gps = new GPSTracker(AndroidGPSTrackingActivity.this);

                // check if GPS enabled     
                if(gps.canGetLocation()){

                    double latitude = gps.getLatitude();
                    double longitude = gps.getLongitude();

                    SQLiteDatabase dbm = this.getWritableDatabase();
                    ContentValues cv = new ContentValues();

                    cv.put("latitude", gps.getLatitude());
                    cv.put("longitude", gps.getLongitude());


                    long result = dbm.insert("location",null,cv);



                   Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();    
                }else{
                    gps.showSettingsAlert();
                }

            }

            private SQLiteDatabase getWritableDatabase() {
                // TODO Auto-generated method stub
                return null;
            }
        });
    }
}

【问题讨论】:

  • java.lang.NullPointerException
  • 当我从中删除 null 时,它会给我一个程序错误,说“SQLiteDatabase 类型中的方法 insert(String, String, ContentValues) 不适用于参数 (String, ContentValues”跨度>

标签: android mysql android-layout android-intent


【解决方案1】:

把这个方法的正确实现:

   private SQLiteDatabase getWritableDatabase() {
        // TODO Auto-generated method stub
        return null;
    }

这个方法返回null

 SQLiteDatabase dbm = this.getWritableDatabase();

所以 dbm 为空,因此在第 46 行出现空指针异常。

12-29 16:19:55.700: E/AndroidRuntime(1319):     at com.example.gpstracking.AndroidGPSTrackingActivity$1.onClick(AndroidGPSTrackingActivity.java:46)

按照下面的链接了解,如何在 db 中读/写

http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/

【讨论】:

  • iam 在这里真的很难将纬度和经度发送到本地 mysql 数据库。我是 android 新手,如果你能提供一个例子会很有帮助。
  • 我已经参考过了。但真正的问题是纬度和经度是使用 gps 自动生成的。所以我想知道如何将这种值传递给 Mysql db
【解决方案2】:

12-29 16:19:55.650: W/dalvikvm(1319): threadid=1: 线程退出 未捕获的异常 (group=0xb39feba8) 12-29 16:19:55.700: E/AndroidRuntime(1319):致命异常:主要 12-29 16:19:55.700: E/AndroidRuntime(1319):进程:com.example.gpstracking,PID:1319 12-29 16:19:55.700: E/AndroidRuntime(1319): java.lang.NullPointerException

我认为问题就在这里

 long result = dbm.insert("location",null,cv);

为什么要发送null ??

结果NullPointerException出现了。

【讨论】:

  • 当我从中删除 null 时,它会给我一个程序错误,说“SQLiteDatabase 类型中的方法 insert(String, String, ContentValues) 不适用于参数(String, ContentValues”跨度>
  • @colombo 你需要添加参数。用于测试用例dbm.insert("location","Test",cv);
  • @colombo 卸载并运行这个应用程序。让我通知
  • 仍然出现同样的问题。
【解决方案3】:

检查一下

gps = new GPSTracker(AndroidGPSTrackingActivity.this);

gps 为空,因此在后台任务中运行 GpsTracker(使用 Asyntask),如果 gps 不为空,则 检查它-

if(gps.canGetLocation())

【讨论】:

    【解决方案4】:

    GPS 无法获取经度和纬度。仅返回 lat lng 的空值。

    只烤 lat 和 lng 的值。

    double latitude = gps.getLatitude();
                        double longitude = gps.getLongitude();
    
                       // SQLiteDatabase dbm = this.getWritableDatabase();
                       // ContentValues cv = new ContentValues();
    
                       // cv.put("latitude", gps.getLatitude());
                       // cv.put("longitude", gps.getLongitude());
    
    
                       // long result = dbm.insert("location",null,cv);
    
    
    
                       Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + String.valueOf(latitude) + "\nLong: " + String.valueOf(longitude), Toast.LENGTH_LONG).show();
    

    发送字符串值不加倍。

    String lat=String.valueOf(latitude);
    String lng= String.valueOf(longitude);
    

    【讨论】:

    • 是的,那是真的..当我评论这些行时,它工作正常。但现在我需要将数据发送到 mysql 数据库。
    • 你必须把它发送到mysql或sqlite?/
    • 到本地创建的mysql数据库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-25
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 2019-10-11
    相关资源
    最近更新 更多